perm filename DFTP.MAC[NET,MRC]2 blob
sn#237778 filedate 1976-09-22 generic text, type T, neo UTF8
TITLE DFTP Datacomputer File Transfer Program
IFNDEF F.TENX,F.TENX==0 ; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX
IFNDEF F.PCAP,F.PCAP==-1 ; PRIVILEGED CAPABILITIES RESTRICTED
IFNDEF F.SAIL,F.SAIL==-1 ; -1 IF FOR SAIL
; ***DEFINITIONS***
DCHOST==37
DCSOKT==303
DEFALO==12
SIZBLK==200
SIZPAG==1000
SIZFIL==↑D5000
LBUFS==100
SBUFS==20
IFL F.TENX,DEFINE THUD<.LOSE 1000>
IFE F.TENX,DEFINE THUD<HALT .-1>
IFG F.TENX,THUD==-1
; REGISTER DEFINITIONS
R1==1
R2==2
R3==3
R4==4
R5==5
R6==6
R7==7
R10==10
R11==11
R12==12
R13==13
R14==14
R15==15
R16==16
R17==17
; (SCRATCH REGISTERS)
REG1==1
REG2==2
REG3==3
REG4==4
; (COMMONLY USED REGISTERS)
IOREG==R5
BPREG==R6
FLAG==R15
UTIL==R16
STAK==R17
; (TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
TCIO==R2 ; IO(REGISTER)
TCIBP==R3 ; B(YTE)P(OINTER)
TCIACB==R4 ; A(DDRESSOF)C(ONTROL)B(LOCK)
TCITLP==R5 ; T(RACE)L(IST)P(OINTER)
TCITCC==R6 ; T(RACE)C(OMMAND)C(OUNTER)
TCIPBP==R7 ; P(ARALLEL)B(YTE)P(OINTER)
TCIPCC==R10 ; P(ARALLEL)C(HARACTER)C(OUNTER)
TCISBP==R11 ; S(ERIAL)B(YTE)P(OINTER)
TCISCC==R12 ; S(ERIAL)C(HARACTER)C(OUNTER)
TCIMAC==R13 ; MA(TCHES--)C(OMMANDS)
TCIMAN==R14 ; MA(TCHES--)N(ULLCHARACTER)
; MACRO DEFINITIONS
SALL
IFL F.TENX,DEFINE RELOC(ADDR)<LOC ADDR>
DEFINE BEGINR(SAVLST,%RETN)
< ..SAVL==0
..SAVC==0
IFIDN <SAVLST><ALL>,<..SAVL==77777>
IFDIF <SAVLST><ALL>,<
IRP SAVLST,<
IFG <SAVLST>-20,<!!
PRINTX SAVLST NOT A REGISTER>
IFLE <SAVLST>-20,<
IFN ..SAVL&1←SAVLST,<!!
PRINTX SAVLST SAVED TWICE>
..SAVL==..SAVL!1←SAVLST
..SAVC==..SAVC+1>>>
IFN ..SAVL,<
..REG==17
REPEAT 20,<
IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
..REG==..REG-1>>
DEFINE .%RETN <%RETN> ; UNIQUE LOCATION FOR RETURN AND ENDR
DEFINE .%RETL <%RETN':!>
..SFLG==0 ; LARGEST SKIP RETURN
>
; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
; JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
; ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>
; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>
; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE ENDR(SK,N)
< IFB <SK>,<..N==0>
IFIDN <SK><SKIP>,<..N==N
IFG <..N-..SFLG>,<..SFLG==..N>>
IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
REPEAT ..SFLG,<
AOS -..SAVC(STAK)>>
.%RETL
..REG==0
REPEAT 20,<
IFN ..SAVL&1←..REG,<POP STAK,..REG
..SAVL==..SAVL-1←..REG>
..REG==..REG+1>
POPJ STAK,>
DEFINE CALLR(ROUTIN)
< PUSHJ STAK,ROUTIN>
DEFINE TAIN(MSG)
< HRRZI REG1,MSG
CALLR $TAIN$>
DEFINE TCIN(CLIST,RSTR)
< MOVE TCIO,[RSTR,,CLIST]
CALLR $TCIN$>
DEFINE TCIL(ARG)
< ..CMCH==0
..CMWD==0
..CNUM==0
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..CNUM==..CNUM+1
..IDX==0
IRPC ARG<..IDX==..IDX+1>
IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
..FLAG==<-..FLAG>>
IFL ..FLAG,<!!
PRINTX BAD ARGUMENTS TO TCIN>
..CMWD==<<<..CMCH-1>/5>+1>
..LOC1==.
..LOC2==..LOC1+4
..LOC3==..LOC2+..CNUM
RELOC ..LOC3
..FLAG==1
IRP ARG<
IFG ..FLAG,<
..IDX==0
IRPC ARG<..IDX==..IDX+1>
..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
ASCII /ARG/
IFG ..IDX,<REPEAT ..IDX, <0>>
..LOC3==.>
IFL ..FLAG,<
RELOC ..LOC2
ARG
..LOC2==.
RELOC ..LOC3>
..FLAG==<-..FLAG>>
RELOC ..LOC1
..LOC2
..CNUM
..CMCH
..CMWD
RELOC ..LOC3>
DEFINE TSIN(BUFFER,BUFS,MSG,NOECHO)
< MOVE IOREG,[BUFFER,,5*BUFS]
IFB <NOECHO>,< HRRZI UTIL,MSG>
IFNB <NOECHO>,< HRROI UTIL,MSG>
CALLR $TSIN$>
DEFINE TNIN(MSG,RADIX)
< IFB <RADIX>,< MOVE IOREG,[MSG,,↑D10]>
IFNB <RADIX>,< MOVE IOREG,[MSG,,RADIX]>
CALLR $TNIN$>
DEFINE TNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRRZI REG2,↑D10>
IFNB <RADIX>,< HRRZI REG2,RADIX>
CALLR $NOUT$>
DEFINE DCNOUT(REG,RADIX)
< IFN <REG1-REG>,< MOVE REG1,REG>
IFB <RADIX>,< HRROI REG2,↑D10>
IFNB <RADIX>,< HRROI REG2,RADIX>
CALLR $NOUT$>
DEFINE PATH(STRING,FLAGS)
< IFB <FLAGS>,< HRRZI IOREG,STRING>
IFNB <FLAGS>,<
HRRI IOREG,STRING
HRLI IOREG,FLAGS>
CALLR $PATH$>
DEFINE SCOPY(SOURCE,DESTIN)
< ILDB 0,SOURCE
JUMPE 0,.+3
IDPB 0,DESTIN
JRST .-3
MOVE SOURCE,DESTIN
IDPB 0,SOURCE>
; SYSTEM DEPENDENT DEFINITIONS
; ((ITS))
IFL F.TENX,<
SEARCH SITS
LOC 150
; Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO. First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).
INIT: MOVSI (JUMPA)
HRR .JBSA##
.BREAK 12,[400001,,] ;set start address
SETZ 1,
MOVE [1,,2]
BLT 150
.BREAK 16,100000 ;return to DDT
JRST DFTP
; I/O Channels
TTI==1 ; TTY I/O
TTO==2
DCI==3 ; Datalanguage I/O
DCO==4
ICP==5 ; ICP channel
DDI==6 ; Data I/O
DDO==7
LCI==10 ; Local input
LCO==11 ; Local output
; ITS network definitions
%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11
DEFINE TBIN(REG)
< .IOT TTI,REG
CAIG REG,"z"
CAIGE REG,"a"
CAIA
TRZ REG," ">
TBOUT==<.IOT TTO,>
DEFINE TSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$STRIN
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$STRIN: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$STRI1: ILDB R1 ; get a character from string
JUMPE $STRI2 ; quit when done
.IOT TTO, ; output the character
JRST $STRI1 ; and loop for more
$STRI2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
DEFINE DCBIN(REG)
< .IOT DCI,REG
SKIPE FLAGDD
.IOT TTO,REG
>
DCBOUT==<.IOT DCO,>
DEFINE DCSOUT(STRING)
< IRP STRING
< PUSH STAK,R1
MOVEI R1,STRING
PUSHJ STAK,$DSTRI
POP STAK,R1
>>
; Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.
$DSTRI: PUSH STAK, ; save AC 0
HRLI R1,(POINT 7,) ; build a byte pointer to string
$DSTR1: ILDB R1 ; get a character from string
JUMPE $DSTR2 ; quit when done
.IOT DCO, ; output the character
SKIPE FLAGDD ; show DATALANGUAGE?
.IOT TTO,
JRST $DSTR1 ; and loop for more
$DSTR2: POP STAK, ; restore AC 0
POPJ STAK, ; and return
>
; (((TOPS-10)))
IFE F.TENX,<
TWOSEG
RELOC 400000
DCCHAN==1
DDCHAN==2
LFCHAN==3
LDCHAN==4
; DEFINITIONS FROM "IMP.MAC"
.IBDEV==0
.IBSTT==1
.IBERR==1
.IBLCL==2
.IBHST==3
.IBRMT==4
.IUSTT==0
.IUCON==3
.IUCLS==4
.IULSN==5
.IULHS==15
.IESOF==5
.IESKT==11
.IEDWN==13
.IETIM==15
DEFINE TBIN(REG)
< TTCALL 0,REG
CAILE REG,"Z"+40
JRST .+3
CAIL REG,"A"+40
SUBI REG,40>
DEFINE TBOUT(REG)
< TTCALL 1,REG>
DEFINE TSOUT(STRING)
< IRP STRING
< TTCALL 3,STRING>>
DEFINE DCBIN(REG)
< SKIPG DCIBUF+2
CALLR NUTMI
SOS DCIBUF+2
ILDB REG,DCIBUF+1>
DEFINE DCBOUT(REG)
< IDPB REG,DCOBUF+1
OUT DCCHAN,
JRST .+2
JRST NETEOT>
DEFINE DCSOUT(STRING)
< IRP STRING
< HRRZI REG1,STRING
CALLR NUTMO>
SKIPN FLAGDD
JRST .+3
HRRZ REG1,DCOBUF
CALLR NUTDD
OUT DCCHAN,
JRST .+2
JRST NETEOT>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SEARCH STENEX
DEFINE TBIN(REG)
< PBIN
CAILE REG1,"Z"+40
JRST .+3
CAIL REG1,"A"+40
SUBI REG1,40
IFN <REG1-REG>,< HRRZI REG,(REG1)>>
DEFINE TBOUT(REG)
< IFN <REG1-REG>,< HRRZI REG1,(REG)>
PBOUT>
DEFINE TSOUT(STRING)
< IRP STRING
< HRROI REG1,STRING
PSOUT>>
DEFINE DCBIN(REG)
< MOVE REG1,DCIJFN
BIN
SKIPN FLAGDD
JRST .+3
HRRZI REG1,(REG2)
PBOUT
HRRZI REG,(REG2)>
DEFINE DCBOUT(REG)
< MOVE REG1,DCOJFN
HRRZI REG2,(REG)
BOUT
MOVEI REG2,21
MTOPR>
DEFINE DCSOUT(STRING)
< ..IDX==1
IRP STRING<..IDX==..IDX+2>
SKIPN FLAGDD
JRST .+..IDX
IRP STRING
< HRROI REG1,STRING
PSOUT>
MOVE REG1,DCOJFN
SETZ REG3,
IRP STRING
< HRROI REG2,STRING
SOUT>
MOVEI REG2,21
MTOPR>
>
; (((↑↑↑)))
; ***PROGRAM***
DFTP:
IFE F.TENX,JFCL ;CCL ENTRY POINT
IFGE F.TENX,RESET
MOVE STAK,[IOWD STSIZ,STBEG]
CALLR S$INIT
CALLR D$INIT
; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
; (((ITS)
IFL F.TENX,<
MOVEI UTIL,CMDM2
.SUSET [.RXUNAME,,REG1]
.CALL [ SETZ
SIXBIT/OPEN/
MOVEI
[('DSK')]
['.FILE.']
['(DIR) ']
SETZ REG1]
MOVEI UTIL,CMDM1 ; NO ITS DIRECTORY
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
MOVEI UTIL,CMDM1
; (!DISABLE!)
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
MOVEI UTIL,CMDM1
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNE REG2,600000 ; (1B18+1B19) WHEEL OR OPER
MOVEI UTIL,CMDM2
>
; (((↑↑↑)))
>
; (((↑↑↑)))
MOVEM UTIL,CMDMOD
JRST CMDCMD
CMDNEW: TSOUT <CRLF>
CMDCMD: JRST @CMDMOD
CMDM1: TSOUT <[ASCIZ /*/]>
TCIN (CMDMC1,[ASCIZ /*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM2: TSOUT <[ASCIZ /*/]>
TCIN (CMDMC2,[ASCIZ /*/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
CMDM3: TSOUT <[ASCIZ /!/]>
TCIN (CMDMC3,[ASCIZ /!/])
JRST CMDCMD
JRST CMDNEW
JRST (FLAG)
; (((ITS)))
IFL F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2: TCIL <ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3: TCIL <ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
CALO: PATH ([ASCIZ / ALLOCATE /],PATHCC)
JRST CMDCMD
TSOUT <[ASCIZ / [Megabits:/]>
TNIN ([ASCIZ / [Megabits:/])
JRST CMDCMD
MOVEM IOREG,ABUF
JUMPN IOREG,CALO0
MOVEI IOREG,"0"
TBOUT <IOREG>
CALO0: TSOUT <[ASCIZ /]/],CRLF>
CALLR DALO
JRST CMDCMD
CATT: PATH ([ASCIZ / ATTACH /],PATHCT)
JRST CMDCMD
CALLR DATT
JRST CMDCMD
CCHA: PATH ([ASCIZ / CHANGE /],PATHCC)
JRST CMDCMD
CALLR DCHA
JRST CMDCMD
CCON: PATH ([ASCIZ / CONNECT /],PATHCA!PATHN2)
JRST CMDCMD
CALLR DCON
JRST CMDCMD
CCOP: PATH ([ASCIZ / COPY /],PATHCC!PATHRR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DCOP
JRST CMDCMD
CCRE: PATH ([ASCIZ / CREATE /],PATHCC)
JRST CMDCMD
CALLR DCRE
JRST CMDCMD
CDEL: PATH ([ASCIZ / DELETE /],PATHCC!PATHSS!PATHST!PATHPP!PATHAC)
JRST CMDCMD
CALLR DDEL
JRST CMDCMD
CDIR: PATH ([ASCIZ / DIRECTORY /],PATHCC!PATHN1!PATHSS!PATHST)
JRST CMDCMD
MOVE IOREG,CMDMOD
CAIN IOREG,CMDM3
JRST CDIR0
TSOUT <[ASCIZ /**/]>
TCIN (CDIRC1,[ASCIZ /**/])
JRST CMDCMD
JRST CDIR1
JRST CDIR2
CDIR0: TSOUT <[ASCIZ /!!/]>
TCIN (CDIRC2,[ASCIZ /!!/])
JRST CMDCMD
JRST CDIR1
JRST CDIR2
CDIR1: TSOUT <[ASCIZ /TERSE/]>
MOVEI FLAG,DD$T
CDIR2: TSOUT <CRLF>
CALLR DDIR
JRST CMDCMD
CDIRC1: TCIL <CREATION,DD$C,TERSE,DD$T,VERBOSE,DD$V>
CDIRC2: TCIL <CREATION,DD$C,PROTECTION,DD$P,TERSE,DD$T,VERBOSE,DD$V>
CDIS: TSOUT <CRLF>
MOVEI UTIL,CMDM2
MOVEM UTIL,CMDMOD
JRST CMDCMD
CENA: TSOUT <CRLF>
MOVEI UTIL,CMDM3
MOVEM UTIL,CMDMOD
JRST CMDCMD
; (((TENEX)))
IFG F.TENX,<
CEXE: MOVEI REG1,37
PBOUT
HRRZI REG1,-1
RFMOD
MOVE R10,REG2
RFCOC
MOVE R11,REG2
MOVE R12,REG3
HRLZI REG1,(1B1) ; INFERIOR GETS THIS FORK'S CAPABILITIES
CFORK ; CREATE FORK
THUD
MOVE UTIL,REG1
HRLZI REG1,(1B2+1B17)
HRROI REG2,[ASCIZ /<SYSTEM>EXEC.SAV/]
GTJFN
THUD
HRLI REG1,(UTIL)
GET ; LOAD EXEC INTO FORK
MOVE REG1,UTIL
SETZ REG2,
SFRKV ; START FORK AT MAIN STARTUP
WFORK
KFORK
HRRZI REG1,-1
MOVE REG2,R10
SFMOD
MOVE REG2,R11
MOVE REG3,R12
SFCOC
JRST CMDCMD
>
; (((↑↑↑)))
CGET: PATH ([ASCIZ / GET /],PATHCC!PATHRL!PATHSS!PATHPO)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CLIN: TSOUT <CRLF>
CALLR DLIN
JRST CMDCMD
; (((TOPS-10)))
IFE F.TENX,<
CLOD: TTCALL 3,CRLF
SETZM LUTDSP
CLOD1: CALLR LUTDS
JRST CMDCMD
MOVEI REG1," "
TTCALL 1,REG1
TTCALL 3,ABUF
TTCALL 3,CRLF
JRST CLOD1
>
; (((↑↑↑)))
CNOD: SETZM FLAGDD
JRST CMDNEW
CPUT: PATH ([ASCIZ / PUT /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CQUI: TSOUT <CRLF>
JRST QUIT
CRET: PATH ([ASCIZ / RETRIEVE /],PATHCC!PATHRL!PATHSS!PATHPO)
JRST CMDCMD
CALLR DGET
JRST CMDCMD
JRST CMDCMD
CSOD: SETOM FLAGDD
JRST CMDNEW
CSTO: PATH ([ASCIZ / STORE /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
JRST CMDCMD
CALLR DPUT
JRST CMDCMD
JRST CMDCMD
CTTR: SETOM FLAGTT
JRST CMDNEW
CUTR: SETZM FLAGTT
JRST CMDNEW
CVER: PATH ([ASCIZ / VERIFY /],PATHCC!PATHLR!PATHSS!PATHPO)
JRST CMDCMD
CALLR DVER
JRST CMDCMD
JRST CMDCMD
; ***PATH INPUT AND TRANSLATION***
; FLAG DEFINITIONS
PATHCT==400000 ; TOP CONTEXT DEFAULT
PATHCA==200000 ; ATTACH CONTEXT DEFAULT
PATHCC==100000 ; CONNECT CONTEXT DEFAULT
PATHRR==040000 ; REMOTE [TO] REMOTE
PATHLR==020000 ; LOCAL [AS] REMOTE
PATHRL==010000 ; REMOTE [AS] LOCAL
PATHSS==004000 ; SETS -- ALLOWED
PATHST==002000 ; SETS -- TRAILING DEFAULT
PATHN1==000400 ; NULL DEFAULT ONE
PATHN2==000200 ; NULL DEFAULT TWO
PATHPO==000040 ; SECONDARY PATH -- OPEN
PATHPP==000020 ; SECONDARY PATH -- PARENT
PATHAC==000001 ; ACKNOWLEDGE-CONFIRM
; PATH INPUT CONTROL
; IN: TCIO -- LAST CHARACTER INPUT (TCIN)
; IOREG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$: BEGINR <UTIL,FLAG>
MOVE FLAG,IOREG
MOVEI IOREG," "
TBOUT <IOREG>
TLNN FLAG,PATHN1!PATHN2
JRST P$1I
CAIN TCIO,12
JRST P$1N
CAIN TCIO,37
JRST P$1N
P$1I: MOVE IOREG,[GBUF1,,5*LBUFS]
SETZ UTIL,
CALLR P$IN
RETURN
JUMPN UTIL,P$1T
P$1N: TLNN FLAG,PATHN1
JRST P$1N3
CAIN IOREG,33
JRST P$1N2
P$1N1: MOVE REG1,[ASCII /**/]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Nodes]/]>
JRST P$1E
P$1N2: MOVE REG1,[ASCII /</]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Connected Node]/]>
JRST P$1E
P$1N3: MOVE REG1,[ASCII /<</]
MOVEM REG1,GBUF1
TSOUT <[ASCIZ /[Attached Node]/]>
JRST P$1E
P$1T: TLNN FLAG,PATHST
JRST P$1E
CAIN IOREG,33
JRST P$1T1
CAIN IOREG," "
JRST P$1T1
JRST P$1E
P$1T1: MOVE REG1,[440700,,GBUF1]
ILDB REG2,REG1
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPE REG2,P$1T2
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPE REG2,P$1T2
CAIE REG2,"<"
JRST P$1T3
ILDB REG2,REG1
JUMPN REG2,P$1T3
P$1T2: MOVEI REG3,"*"
DPB REG3,REG1
IDPB REG3,REG1
IDPB REG2,REG1
TSOUT ([ASCIZ /[Nodes]/])
JRST P$1E
P$1T3: ILDB REG2,REG1
JUMPN REG2,P$1T3
MOVEI REG3,">"
DPB REG3,REG1
MOVEI REG3,"*"
IDPB REG3,REG1
IDPB REG3,REG1
IDPB REG2,REG1
TSOUT ([ASCIZ />[Nodes]/])
P$1E: TLNE FLAG,PATHLR!PATHRL!PATHRR
JRST P$2
TLNN FLAG,PATHAC
JRST P$1E1
TAIN <[ASCIZ / [Confirm]/]>
RETURN
RETURN
JRST P$1E2
P$1E1: TSOUT <CRLF>
P$1E2: TLNN FLAG,PATHPP
JRST P$1E3
MOVE IOREG,[GBUF1,,PBUF]
HRRZI UTIL,GBUF2
CALLR P$CS
RETURN SKIP,1
P$1E3: MOVE IOREG,[GBUF1,,PBUF]
CALLR P$CP
RETURN SKIP,1
P$2: TLNE FLAG,PATHRR
JRST P$2C
; (((TENEX)))
IFG F.TENX,<
SKIPN LFILE
JRST .+5
TLNN FLAG,PATHRL
JRST .+3
CALLR P$LF
JRST P$2MP
>
; (((↑↑↑)))
CAIN IOREG,33
JRST P$2M
CAIN IOREG," "
JRST P$2M
CALLR P$LF
JRST P$2MP
P$2C: TSOUT <[ASCIZ / [To] /]>
MOVE IOREG,[UBUF1,,5*LBUFS]
MOVE UTIL,[GBUF1,,[ASCIZ / [To] /]]
CALLR P$IN
RETURN
TSOUT <CRLF>
MOVE IOREG,[GBUF1,,GBUF2]
CALLR P$CP
MOVE IOREG,[UBUF1,,GBUF1]
HRRZI UTIL,PBUF
CALLR P$CS
MOVE IOREG,[GBUF2,,UBUF2]
CALLR P$ON
MOVE IOREG,[GBUF1,,UBUF1]
CALLR P$ON
RETURN SKIP,1
P$2M: TSOUT <[ASCIZ / [As] /]>
TLNN FLAG,PATHLR
JRST P$2ML
MOVE REG1,[GBUF1,,ABUF]
BLT REG1,<ABUF+SBUFS-1>
MOVE IOREG,[GBUF1,,5*LBUFS]
MOVE UTIL,[ABUF,,[ASCIZ / [As] /]]
CALLR P$IN
RETURN
JRST P$2MP
P$2ML: MOVE IOREG,[ABUF,,5*SBUFS]
MOVE UTIL,[GBUF1,,[ASCIZ / [As] /]]
CALLR P$IN
RETURN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
P$2MP: TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
P$2MP: SKIPE LJFN
JRST .+3
MOVEI REG1,37
PBOUT
>
; (((↑↑↑)))
CALLR P$LN
TLNN FLAG,PATHPP
JRST P$2M1
MOVE IOREG,[GBUF1,,PBUF]
HRRZI UTIL,GBUF2
CALLR P$CS
JRST P$2M2
P$2M1: MOVE IOREG,[GBUF1,,PBUF]
CALLR P$CP
P$2M2: MOVE IOREG,[PBUF,,ABUF]
CALLR P$ON
ENDR SKIP,1
; PATH INPUT
; IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
; UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
; FLAG -- (SAME AS $PATH$)
; OUT: IOREG -- LAST CHARACTER INPUT
; UTIL -- COUNT OF CHARACTERS
; FLAGS:
P$I$AE==400000 ; ANCHOR ENCOUNTERED (<)
P$I$DE==200000 ; DESCENDER ENCOUNTERED (>,.)
P$I$GE==100000 ; GROUP ENCOUNTERED (*)
P$I$PW==040000 ; INPUT PASSWORD
P$I$CC==004000 ; <
P$I$CA==002000 ; <<
P$I$CT==001000 ; <<<
P$I$FN==000400 ; FILE NAME
;
P$IN: BEGINR <BPREG,R10,R11,R12,R13>
SETZ R10,
MOVE R11,IOREG
MOVE R12,UTIL
HLR BPREG,IOREG
HRLI BPREG,440700
SETZ UTIL,
P$ICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST P$IREP
CAIN IOREG,"A"-100
JRST P$IDEL
CAIN IOREG,"X"-100
JRST P$IENR
CAIN IOREG,177
JRST P$IENR
CAIN IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST P$ICHR
CAIN IOREG,12
JRST P$IEND
CAIN IOREG,33
JRST P$IEND
CAIN IOREG,37
JRST P$IEND
CAIGE IOREG," "
JRST P$IBAD
CAIN IOREG,42
JRST P$IBAD
CAIL UTIL,(R11)
JRST P$IBAD
TRNE R10,P$I$PW
JRST P$ICHP
CAIN IOREG," "
JRST P$IEND
IFGE F.TENX,< ; have to use ' for passwords
CAIN IOREG,":"
JRST P$IPON
>
CAIN IOREG,"'"
JRST P$IPON
CAIN IOREG,"?"
JRST P$IBAD
CAIN IOREG,"<"
JRST P$ISA
CAIN IOREG,">"
JRST P$ISD1
CAIN IOREG,"."
JRST P$ISD2
CAIN IOREG,"*"
JRST P$ISG
TRNE R10,P$I$GE
JRST P$IBAD
TRZ R10,P$I$AE!P$I$DE
P$ICHE: IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA UTIL,P$ICHR
P$ICHP: CAIN IOREG,">"
JRST P$IPOF
CAIN IOREG,"'"
JRST P$IBAD
IDPB IOREG,BPREG
AOJA UTIL,P$ICHR
P$ISA: TRNN R10,P$I$CC
JRST P$ISA1
TRNN R10,P$I$CA
JRST P$ISA2
TRNN R10,P$I$CT
JRST P$ISA3
JRST P$IBAD
P$ISA1: JUMPN UTIL,P$IBAD
TRO R10,P$I$AE!P$I$CC
JRST P$ICHE
P$ISA2: CAIE UTIL,1
JRST P$IBAD
TRO R10,P$I$AE!P$I$CA
JRST P$ICHE
P$ISA3: CAIE UTIL,2
JRST P$IBAD
TRO R10,P$I$AE!P$I$CT
JRST P$ICHE
P$ISD1: JUMPE UTIL,P$IBAD
TRNE R10,P$I$FN
JRST P$IBAD
TRNE R10,P$I$AE
JRST P$IBAD
TROE R10,P$I$DE
JRST P$IBAD
TRZ R10,P$I$GE
JRST P$ICHE
P$ISD2: JUMPE UTIL,P$IBAD
TRNE R10,P$I$AE
JRST P$IBAD
TROE R10,P$I$DE!P$I$FN
JRST P$IBAD
TRZ R10,P$I$GE
JRST P$ICHE
P$ISG: TRZN R10,P$I$AE!P$I$DE
JUMPN UTIL,P$IBAD
TRO R10,P$I$GE
JRST P$ICHE
P$IPON: TRNE R10,P$I$AE!P$I$DE!P$I$GE
JRST P$IBAD
MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
MOVEI REG1,"P"-100
IDPB REG1,BPREG
ADDI UTIL,2
TRO R10,P$I$PW
JRST P$ICHR
P$IPOF: MOVEI REG1,1(UTIL)
CAIL REG1,(R11)
JRST P$IBAD
MOVEI REG1,"P"-100
IDPB REG1,BPREG
IDPB IOREG,BPREG
TBOUT <IOREG>
ADDI UTIL,2
TRZ R10,P$I$PW
TRO R10,P$I$DE
JRST P$ICHR
P$IBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST P$ICHR
P$IREP: TSOUT <CRLF>
TSOUT <(FLAG)>
JUMPE R12,P$IR04
HLR R13,R12
HRLI R13,440700
TRZ R10,P$I$PW
P$IR01: ILDB IOREG,R13
JUMPE IOREG,P$IR03
CAIN IOREG,"P"-100
JRST P$IR02
TRNE R10,P$I$PW
JRST P$IR01
TBOUT <IOREG>
JRST P$IR01
P$IR02: TRC R10,P$I$PW
JRST P$IR01
P$IR03: TSOUT <(R12)>
P$IR04: HRRZI IOREG,(BPREG)
HLR R13,R11
CAIGE IOREG,(R13)
JRST P$ICHR
HRLI R13,440700
TRZ R10,P$I$PW
P$IR05: CAMN R13,BPREG
JRST P$ICHR
ILDB IOREG,R13
CAIN IOREG,"P"-100
JRST P$IR06
TRNE R10,P$I$PW
JRST P$IR05
TBOUT <IOREG>
JRST P$IR05
P$IR06: TRC R10,P$I$PW
JRST P$IR05
P$IDEL: JUMPE UTIL,P$IBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
CAIN IOREG,"P"-100
JRST P$ID01
LDB REG1,BPREG
CAIN REG1,"P"-100
JRST P$ID02
TRNE R10,P$I$PW
SOJA UTIL,P$ICHR
TBOUT <IOREG>
TRZ R10,P$I$AE!P$I$DE!P$I$GE
CAIN IOREG,"."
TRZ R10,P$I$FN
CAIE IOREG,"<"
JRST P$ID00
TRZE R10,P$I$CT
JRST P$ID00
TRZE R10,P$I$CA
JRST P$ID00
TRZ R10,P$I$CC
P$ID00: SUBI UTIL,1
JUMPE UTIL,P$ICHR
LDB REG1,BPREG
CAIN REG1,"<"
TRO R10,P$I$AE
CAIN REG1,">"
TRO R10,P$I$DE
CAIN REG1,"."
TRO R10,P$I$DE
CAIN REG1,"*"
TRO R10,P$I$GE
JRST P$ICHR
P$ID01: TRZ R10,P$I$PW
LDB IOREG,BPREG
JRST P$ID03
P$ID02: TROE R10,P$I$PW
SOJA UTIL,P$ICHR
P$ID03: SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SUBI UTIL,2
JRST P$ICHR
P$IENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
P$IEND: TRNE R10,P$I$DE
JRST P$IBAD
; (((ITS)))
IFL F.TENX,<
CAIE IOREG," "
JRST P$IENN
TLNN FLAG,PATHLR!PATHRL
JRST P$IENN
JUMPN R12,[ TLNE FLAG,PATHRL
JRST P$ICHE ; GET -- second argument
JRST P$IENN]
TLNE FLAG,PATHLR
JRST P$ICHE ; PUT -- first argument
JRST P$IENN
P$IENN:
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
TLNN FLAG,PATHLR!PATHRL
JRST P$IENN
JUMPN UTIL,P$IENN
CAIG R12,-1
JRST .+3
TLNE FLAG,PATHLR
JRST P$IBAD ; PUT -- SECOND ARGUMENT
MOVEI REG1,76
PBOUT
TLNE FLAG,PATHLR
HRLZI REG1,160003 ; OLD,MSG,CONFIRM,JFN,SHORT
TLNE FLAG,PATHRL
HRLZI REG1,660003 ; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
MOVE REG2,[100,,101]
GTJFN
JRST P$IENR
MOVEM REG1,LJFN
HRROI REG1,LFILE
MOVE REG2,LJFN
SETZ REG3,
JFNS
MOVEI REG1,100
BKJFN
THUD
PBIN
MOVEI IOREG,(REG1)
CAILE R12,-1
JRST P$IENE ; GET -- SECOND ARGUMENT
HLRO REG1,R11
MOVE REG2,LJFN
MOVE REG3,[1B8+1B11+1B35] ; NAME,EXT,PUNCTUATION
TLNN FLAG,PATHLR
JRST .+5
CAIN IOREG,33
SETZ REG3,
CAIN IOREG," "
SETZ REG3,
JFNS ; FIRST ARGUMENTS
JUMPE REG3,P$IENE
LDB REG2,REG1
CAIE REG2,"."
JRST P$IENE
SETZ REG2,
DPB REG2,REG1
P$IENE: MOVE REG1,LJFN
RLJFN
THUD
MOVEI UTIL,-1(R11)
SETZM LJFN
CAIN IOREG,12
SETOM LJFN
CAIN IOREG,37
SETOM LJFN
RETURN SKIP,1
P$IENN: SETZM LFILE
SETZM LJFN
>
; (((↑↑↑)))
TLNN FLAG,PATHN1!PATHN2
JUMPE UTIL,P$IBAD
SETZ R13,
IDPB R13,BPREG
ENDR SKIP,1
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
; IN: IOREG -- SOURCE,,DESTINATION
; FLAG -- PATH CONTEXT FLAGS
;
P$CP: BEGINR <IOREG,FLAG>
MOVEI REG1,<<LBUFS*5>-1>
HLR REG2,IOREG
HRLI REG2,350700
HRRI REG3,(IOREG)
HRLI REG3,440700
LDB IOREG,REG2
CAIN IOREG,"<"
JRST P$CPCX
TLNE FLAG,PATHCT
JRST P$CPCT
TLNE FLAG,PATHCA
JRST P$CPCA
JRST P$CPCC
P$CPCX: ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCC
ILDB IOREG,REG2
CAIE IOREG,"<"
JRST P$CPCA
ILDB IOREG,REG2
P$CPCT: MOVE REG4,[440700,,[ASCIZ /%TOP./]]
SCOPY (REG4,REG3)
MOVE REG4,[440700,,ANCHOR]
SCOPY (REG4,REG3)
SUBI REG1,11
JRST P$CPCE
P$CPCA: MOVE REG4,[440700,,[ASCIZ /%LOGIN/]]
SCOPY (REG4,REG3)
SUBI REG1,6
JRST P$CPCE
P$CPCC: MOVE REG4,[440700,,CONTEX]
ILDB 0,REG4
JUMPE 0,.+4
SOJL REG1,P$CPE
IDPB 0,REG3
JRST .-4
MOVE REG4,REG3
IDPB 0,REG4
P$CPCE: JUMPE IOREG,P$CPZ0
MOVEI REG4,"."
IDPB REG4,REG3
SUBI REG1,1
MOVEI REG4,42
SETZ FLAG,
JRST P$CPI0
P$CPI: ILDB IOREG,REG2
P$CPI0: CAIN IOREG,"P"-100
JRST P$CPI
CAIN IOREG,">"
JRST P$CPS
CAIN IOREG,"."
JRST P$CPS
JUMPE IOREG,P$CPZ
JUMPN FLAG,P$CPO
CAIN IOREG,":"
JRST P$CPP
CAIN IOREG,"'"
JRST P$CPP
CAIN IOREG,"*"
JRST P$CPO
CAIGE IOREG,"A"
JRST P$CPQ
CAILE IOREG,"Z"
JRST P$CPQ
P$CPO: SOJL REG1,P$CPE
IDPB IOREG,REG3
JRST P$CPI
P$CPQ: SOJL REG1,P$CPE
IDPB REG4,REG3
JRST P$CPO
P$CPS: JUMPE FLAG,.+6
MOVEI IOREG,"'"
IDPB IOREG,REG3
MOVEI IOREG,")"
IDPB IOREG,R3
SETZ FLAG,
MOVEI IOREG,"."
JRST P$CPO
P$CPP: SUBI REG1,4
JUMPL REG1,P$CPE
MOVEI IOREG,"("
IDPB IOREG,R3
MOVEI IOREG,"'"
IDPB IOREG,R3
SETO FLAG,
JRST P$CPI
P$CPE: TSOUT <[ASCIZ / (Pathname too long.)/],CRLF>
MOVE STAK,[IOWD STSIZ,STBEG]
JRST CMDCMD
P$CPZ: JUMPE FLAG,.+5
MOVEI REG1,"'"
IDPB REG1,REG3
MOVEI REG1,")"
IDPB REG1,REG3
P$CPZ0: IDPB IOREG,REG3
ENDR
; CONVERT PATH -- SUPERIOR (IF ANY) AND COMPLETE PATH
; IN: IOREG -- SOURCE,,DESTINATION
; UTIL -- DESTINATION OF SUPERIOR PATH
;
P$CS: BEGINR <BPREG,UTIL>
HLR REG1,IOREG
HRLI REG1,440700
MOVE REG2,REG1
SETZM (UTIL)
P$CS1: ILDB REG3,REG2
JUMPE REG3,P$CS2
CAIN REG3,">"
MOVE REG1,REG2
CAIN REG3,"<"
MOVE REG1,REG2
JRST P$CS1
P$CS2: ILDB REG2,REG1
JUMPE REG2,P$CS3
CAIE REG2,"."
JRST P$CS2
MOVE BPREG,REG1
SETZ REG1,
DPB REG1,BPREG
HRLI UTIL,(IOREG)
HRRI IOREG,(UTIL)
CALLR P$CP
HLR IOREG,UTIL
MOVEI REG1,">"
DPB REG1,BPREG
P$CS3: CALLR P$CP
ENDR
; DATACOMPUTER OPEN NODE NAME
; IN: IOREG -- SOURCE,,DESTINATION
;
P$ON: BEGINR
HLR REG1,IOREG
HRLI REG1,440700
MOVE REG2,REG1
P$ONI: ILDB REG3,REG2
JUMPE REG3,P$ONM
CAIN REG3,"."
MOVE REG1,REG2
CAIN REG3,42
IBP REG2
JRST P$ONI
P$ONM: HRRI REG2,(IOREG)
HRLI REG2,440700
P$ONM1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,P$ONM1
ENDR
; LOCAL FILE NAME FIND
;
P$LF: BEGINR
MOVE REG1,[440700,,GBUF1]
MOVE REG2,[440700,,GBUF1]
P$LFI: ILDB REG3,REG2
JUMPE REG3,P$LFM
CAIN REG3,">"
MOVE REG1,REG2
CAIN REG3,"<"
MOVE REG1,REG2
JRST P$LFI
P$LFM: MOVE REG2,[440700,,ABUF]
P$LFM1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,P$LFM1
ENDR
; LOCAL FILE NAME PREPARATION
;
P$LN: BEGINR <IOREG>
; (((TOPS-10+ITS)))
IFLE F.TENX,<
HRRZI IOREG,ABUF
CALLR LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
SKIPE LFILE
RETURN
MOVE IOREG,[ABUF,,LFILE]
BLT IOREG,<LFILE+SBUFS-1>
>
; (((↑↑↑)))
ENDR
; ***DATACOMPUTER INTERFACE ROUTINES***
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT: BEGINR <IOREG,BPREG,UTIL,FLAG>
SETZM FLAGDE
CALLR RENDER
JRST .+2
JRST D$IN0
TSOUT <[ASCIZ / ?? DATACOMPUTER initialization failure ??/],CRLF>
JRST QUIT
D$IN0: TSOUT <[ASCIZ / [Attaching]/],CRLF>
HRRZI UTIL,HOSTS
D$IN1: SKIPN (UTIL)
JRST D$IND
HLRZ REG1,(UTIL)
CAME REG1,LHOST
AOJA UTIL,D$IN1
MOVE IOREG,[440700,,[ASCIZ /%TOP.DFTP./]]
MOVE BPREG,[440700,,ABUF]
SCOPY (IOREG,BPREG)
HRR IOREG,(UTIL)
HRLI IOREG,440700
SCOPY (IOREG,BPREG)
MOVEI IOREG,"."
IDPB IOREG,BPREG
; (((ITS)))
IFLE F.TENX,<
.SUSET [.RXUNAME,,UBUF1]
SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
IFE F.SAIL,<
MOVE REG1,[-1,,31]
MOVE REG2,[-1,,32]
GETTAB REG1,
THUD
GETTAB REG2,
THUD
MOVEM REG1,UBUF1
MOVEM REG2,<UBUF1+1>
>
IFN F.SAIL,<
GETPPN REG1,
JFCL
MOVEM REG1,UBUF1
SETZM UBUF1+1
>
>
; (((↑↑↑)))
; (((TOPS-10+ITS)))
IFLE F.TENX,<
SETZM <UBUF1+2>
MOVE REG1,[440600,,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+7
ADDI REG3,40
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-7
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
GJINF
CAMN REG1,REG2
JRST .+10
HRROI REG1,[ASCIZ / (from /]
PSOUT
MOVEI REG1,101
DIRST
THUD
HRROI REG1,[ASCIZ /)
/]
PSOUT
HRROI REG1,UBUF1
DIRST
THUD
MOVE REG1,[440700,,UBUF1]
MOVEI REG2,42
ILDB REG3,REG1
JUMPE REG3,.+6
CAIL REG3,"A"
CAILE REG3,"Z"
IDPB REG2,BPREG
IDPB REG3,BPREG
JRST .-6
MOVE REG1,BPREG
IDPB REG3,REG1
>
; (((↑↑↑)))
DCSOUT <[ASCIZ /LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
DCSOUT <[ASCIZ /LIST /],ABUF,SEMI>
CALLR RENDER
JRST D$IND
MOVEI FLAG,3
D$IN2: TSOUT <[ASCIZ / [Password:/]>
TSIN (UBUF1,LBUFS,<[ASCIZ / [Password:/]>,NOECHO)
JRST D$IN2
TSOUT <[ASCIZ /]/],CRLF>
MOVE REG2,BPREG
MOVEI REG1,"("
IDPB REG1,REG2
MOVEI REG1,"'"
IDPB REG1,REG2
MOVE REG1,[440700,,UBUF1]
SCOPY (REG1,REG2)
MOVEI REG1,"'"
IDPB REG1,REG2
MOVEI REG1,")"
IDPB REG1,REG2
SETZ REG1,
IDPB REG1,REG2
DCSOUT <[ASCIZ /LOGIN /],ABUF,SEMI>
CALLR RENDER
JRST .+2
JRST D$INP
TSOUT <[ASCIZ / (Incorrect password.)/],CRLF>
SOJG FLAG,D$IN2
TSOUT <[ASCIZ / [Attaching]/],CRLF>
D$IND: MOVE REG1,[440700,,[ASCIZ /%TOP.DFTP.DFTP.GUEST/]]
MOVE REG2,[440700,,ABUF]
SCOPY (REG1,REG2)
DCSOUT <[ASCIZ /LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
TSOUT <[ASCIZ / (as DFTP.GUEST)/],CRLF>
D$INP: DCSOUT <[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DALO -- ALLOCATE SPACE
;
DALO: BEGINR
DCSOUT <[ASCIZ /MODIFY /],PBUF,<[ASCIZ /,M=/]>>
MOVE IOREG,ABUF
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DATT -- LOGIN TO NODE
;
DATT: BEGINR
DCSOUT <[ASCIZ /CLOSE %OPEN/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
DCSOUT <[ASCIZ /LOGIN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST QUIT
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA: BEGINR <IOREG,UTIL>
DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIV/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCHAD: DCSOUT <[ASCIZ /DELETEP /],PBUF,<[ASCIZ /,N=1/]>,SEMI>
CALLR RENDER
JRST .+2
JRST DCHAD
TSOUT <[ASCIZ / [OK]/],CRLF>
DCHAI: TAIN <[ASCIZ / Add a new privilege? /]>
RETURN
RETURN
SETZM ABUF ; WRITE FLAG
SETZM <ABUF+1> ; HOST
SETOM <ABUF+2> ; SOCKET
SETOM <ABUF+3> ; PASSWORD
TAIN <[ASCIZ / Allow control? /]>
JRST DCHAI
SETOM ABUF
TAIN <[ASCIZ / Restrict via network? /]>
JRST DCHAI
JRST DCHAI3
TSOUT <[ASCIZ / Site: /]>
TNIN ([ASCIZ / Site: /],10)
JRST DCHAI
JUMPE IOREG,DCHAI1
MOVEM IOREG,<ABUF+1>
TSOUT <CRLF>
TSOUT <[ASCIZ / Socket: /]>
TNIN ([ASCIZ / Socket: /],10)
JRST DCHAI
JUMPN IOREG,DCHAI2
TSOUT <[ASCIZ /(Any)/]>
JRST DCHAI2
DCHAI1: MOVE IOREG,LHOST
MOVEM IOREG,<ABUF+1>
TSOUT <[ASCIZ /(Local)/],CRLF>
; (((NOT ITS OR SAIL)))
IFGE F.TENX,<
IFE F.SAIL,<
TSOUT <[ASCIZ / User: /]>
; (((TOPS-10)))
IFE F.TENX,<
TNIN ([ASCIZ / User: /],10)
JRST DCHAI
LSH IOREG,11
ADDI IOREG,100
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
TSIN (UBUF1,LBUFS,[ASCIZ / User: /])
JRST DCHAI
SETZ REG1,
MOVE REG2,[440700,,UBUF1]
STDIR
JRST .+3
JRST .+2
JRST .+4
HRROI REG1,[ASCIZ / (User not found.)
/]
PSOUT
JRST DCHAI
HRRZI IOREG,(REG1)
LSH IOREG,↑D15
ADDI IOREG,20
>
>
>
; (((↑↑↑)))
IFL F.TENX,SETZ IOREG,
IFN F.SAIL,SETZ IOREG,
DCHAI2: MOVEM IOREG,<ABUF+2>
TSOUT <CRLF>
DCHAI3: TAIN <[ASCIZ / Restrict via password? /]>
JRST DCHAI
JRST DCHAC
TSOUT <[ASCIZ / Password: /]>
TSIN (<ABUF+3>,<SBUFS-3>,[ASCIZ / Password: /])
JRST DCHAI
TSOUT <CRLF>
DCHAC: DCSOUT <[ASCIZ /CREATEP /],PBUF,<[ASCIZ /,U=**,G=LR/]>>
SKIPE ABUF
JRST DCHAC1
DCSOUT <[ASCIZ /C/]>
DCHAC1: SKIPN <ABUF+1>
JRST DCHAC3
DCSOUT <<[ASCIZ /,H=/]>>
MOVE IOREG,<ABUF+1>
DCNOUT <IOREG>
DCSOUT <<[ASCIZ /,S=/]>>
MOVE IOREG,<ABUF+2>
JUMPE IOREG,DCHAC2
DCNOUT <IOREG>
JRST DCHAC3
DCHAC2: DCSOUT <[ASCIZ /ANY/]>
DCHAC3: SETO IOREG,
CAMN IOREG,<ABUF+3>
JRST DCHAC4
DCSOUT <<[ASCIZ /,P='/]>,<ABUF+3>,[ASCIZ /'/]>
DCHAC4: DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
TSOUT <[ASCIZ / [OK]/],CRLF>
JRST DCHAI
ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON: BEGINR
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST DCON1
TSOUT <[ASCIZ / [Old Node]/],CRLF>
JRST DCON2
RETURN
DCON1: TAIN <[ASCIZ / [New Node][Confirm]/]>
RETURN
RETURN
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCON2: MOVE REG1,[440700,,PBUF]
MOVE REG2,[440700,,CONTEX]
SCOPY (REG1,REG2)
ENDR
; DCOP -- COPY FILES WITHIN THE DATACOMPUTER
;
DCOP: BEGINR <FLAG>
SETZ FLAG,
MOVE REG1,[440700,,UBUF1]
MOVE REG2,[440700,,UBUF2]
ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DCOP0
JUMPN REG3,.-4
CALLR DCOP$T
RETURN
DCOP0: DCSOUT <[ASCIZ /OPEN /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /LIST /],GBUF1,SEMI>
CALLR RENDER
JRST DCOP1
TAIN <[ASCIZ / [Old File][Confirm]/]>
JRST DCOPE3
JRST DCOPE3
DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE3
JRST DCOP2
DCOP1: TSOUT <[ASCIZ / [New File]/],CRLF>
SKIPN PBUF
JRST DCOP2
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST .+2
JRST DCOP2
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE2
SETO FLAG,
DCOP2: DCSOUT <[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE2
DCSOUT <UBUF1,[ASCIZ /=/],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE1
DCSOUT <[ASCIZ /CLOSE /],UBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOPE1
DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DCOPE1: DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
DCOPE2: JUMPE FLAG,DCOPE3
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
CALLR RENDER
JRST .+1
DCOPE3: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
RETURN
ENDR
; ('TEMPORARY FILE' COPY)
DCOP$T: BEGINR
DCSOUT <[ASCIZ /LIST /],GBUF1,SEMI>
CALLR RENDER
JRST DCOT1
TAIN <[ASCIZ / [Old File][Confirm]/]>
RETURN
RETURN
JRST DCOT2
DCOT1: TSOUT <[ASCIZ / [New File]/],CRLF>
DCOT2: DCSOUT <[ASCIZ /OPEN /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /CREATE "<TEMPORARY" FILE"> LIKE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE1
DCSOUT <[ASCIZ /"<TEMPORARY" FILE">=/],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE2
DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE4
DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
SKIPN PBUF
JRST DCOT3
DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST .+2
JRST DCOT3
DCSOUT <[ASCIZ /CREATE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
SETO FLAG,
DCOT3: DCSOUT <[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE "<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE4
DCSOUT <UBUF1,[ASCIZ /="<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
DCSOUT <[ASCIZ /CLOSE /],UBUF1,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DCOTE3
DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DCOTE1: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
RETURN
RETURN
DCOTE2: DCSOUT <[ASCIZ /CLOSE /],UBUF2,SEMI>
CALLR RENDER
JRST DCOTE4
JRST DCOTE4
DCOTE3: DCSOUT <[ASCIZ /DELETE /],GBUF1,SEMI>
CALLR RENDER
JRST .+1
JUMPE FLAG,DCOTE4
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
CALLR RENDER
JRST .+1
DCOTE4: DCSOUT <[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
CALLR RENDER
RETURN
ENDR
; DCRE -- CREATE NEW NODE
;
DCRE: BEGINR
DCSOUT <[ASCIZ /CREATE /],PBUF,<[ASCIZ /,M=/]>>
MOVEI IOREG,DEFALO
DCNOUT <IOREG>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
CALLR DCHA
ENDR
; DDEL -- DELETE NODES/FILES
;
DDEL: BEGINR
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DDEL0
SKIPN GBUF2
JRST DDEL0
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
JRST .+1
DDEL0: DCSOUT <[ASCIZ /LIST /],CONTEX,SEMI>
CALLR RENDER
JRST .+2
RETURN
TSOUT <[ASCIZ / [Connected To Attached Node]/],CRLF>
MOVE REG1,[ASCII /%LOGI/]
MOVEM REG1,CONTEX
MOVE REG1,[ASCII /N/]
MOVEM REG1,<CONTEX+1>
ENDR
; DDIR -- LIST THE DIRECTORY
; IN: FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR: BEGINR <IOREG,UTIL>
SETZ UTIL,
SETZM GBUF1
MOVE REG1,[GBUF1,,GBUF1+1]
BLT REG1,<GBUF1+LBUFS-1>
MOVEI REG1,<GBUF2+1>
MOVEM REG1,GBUF2
; (((TENEX)))
IFG F.TENX,<
SETZM FLAGCO
>
; (((↑↑↑)))
CAIN FLAG,DD$C
JRST DDIRO1
CAIN FLAG,DD$P
JRST DDIRO2
CAIN FLAG,DD$T
JRST DDIRO3
CAIN FLAG,DD$V
JRST DDIRO4
RETURN
DDIRO1: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %SOURCE/],SEMI>
JRST DDIRI
DDIRO2: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIVILEGE/],SEMI>
JRST DDIRI
DDIRO3: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %NAME/],SEMI>
JRST DDIRI
DDIRO4: DCSOUT <[ASCIZ /LIST /],PBUF,[ASCIZ / %INFORMATION/],SEMI>
DDIRI: CALLR RENPRE
CAMN IOREG,[ASCII /.I280/]
JRST DDIRD
CALLR RENLIP
JRST DDIRER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRN: DCBIN <IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRN: SKIPN FLAGCO
JRST DDIRN0
HRROI REG1,[ASCIZ / [Aborting]
/]
PSOUT
MOVE REG1,DCOJFN
MOVEI REG2,22
MTOPR
CALLR RENDER
JRST .+1
DCSOUT <SEMI>
JRST DDIRER
DDIRN0: DCBIN <IOREG>
>
; (((↑↑↑)))
CAIE IOREG," "
JRST DDIRE
SETO UTIL,
SKIPE FLAGDD
JRST DDIRD
CALLR <(FLAG)>
JRST DDIRN
DDIRD: CALLR RENLIN
JRST DDIRN
DDIRE: CAIN IOREG,"?"
JRST DEATH
CALLR RENLIN
JUMPN UTIL,DDIRER
TSOUT <[ASCIZ / [No Nodes]/],CRLF>
DDIRER: CALLR RENDER
RETURN
ENDR
; DD$C -- CREATION
;
DD$C: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$C5
DD$C1: DCBIN <IOREG>
CAIN IOREG,15
JRST DD$C3
CAIE IOREG,"*"
JRST DD$C1
MOVEI IOREG,11
TBOUT <IOREG>
DD$C2: DCBIN <IOREG>
CAIN IOREG,15
JRST DD$C4
CAIN IOREG,"*"
JRST DD$C4
TBOUT <IOREG>
JRST DD$C2
DD$C3: TSOUT <[ASCIZ / [Undated]/]>
DD$C4: TSOUT <CRLF>
DD$C5: CALLR RENLIN
ENDR
; DD$P -- PROTECTION
;
DD$P: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$P1
TSOUT <CRLF>
CALLR RENLIN
RETURN
DD$P1: MOVEI IOREG,GBUF1
DD$P2: SKIPE (IOREG)
AOJA IOREG,DD$P2
SUBI IOREG,GBUF1
DD$P3: TSOUT <[ASCIZ / /]>
SOJGE IOREG,DD$P3
MOVEI IOREG,"]"
TBOUT <IOREG>
DD$P4: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DD$P4
ENDR
; DD$T -- TERSE
;
DD$T: BEGINR <IOREG>
CALLR DD$NAM
JRST DD$T4
DCBIN <IOREG>
CAIN IOREG,"F"
JRST DD$T1
CAIN IOREG,"P"
JRST DD$T2
JRST DD$T3
DD$T1: TSOUT <[ASCIZ / [F]/]>
JRST DD$T3
DD$T2: TSOUT <[ASCIZ / [P]/]>
DD$T3: TSOUT <CRLF>
DD$T4: CALLR RENLIN
ENDR
; DD$V -- VERBOSE
;
DD$V: BEGINR <IOREG,UTIL,FLAG>
DD$VN: DCBIN <IOREG>
CAIE IOREG,"="
JRST DD$VN
CALLR DD$NAM
JRST DD$VE
TSOUT <CRLF>
MOVEI UTIL,GBUF1
SKIPE (UTIL)
AOJA UTIL,.-1
SUBI UTIL,GBUF1
DD$VF: DCBIN <IOREG>
CAIE IOREG,"="
JRST DD$VF
DCBIN <IOREG>
SETZ FLAG,
CAIN IOREG,"F"
MOVEI FLAG,3
CAIN IOREG,"P"
MOVEI FLAG,1
CAIN IOREG,"N"
MOVEI FLAG,3
JUMPE FLAG,DD$VE
CALLR RENLIN
DD$VD: MOVEI IOREG,(UTIL)
DD$VD0: TSOUT <[ASCIZ / /]>
SOJGE IOREG,DD$VD0
MOVEI IOREG,"]"
TBOUT <IOREG>
DD$VD1: DCBIN <IOREG>
TBOUT <IOREG>
CAIE IOREG,12
JRST DD$VD1
SOJG FLAG,DD$VD
RETURN
DD$VE: CALLR RENLIN
ENDR
; DD$NAM -- DIRECTORY: NAME OUTPUT
; OUT: IOREG -- LAST CHARACTER INPUT
;
DD$NAM: BEGINR <BPREG,UTIL,FLAG,R10>
SETZ R10,
SETZ FLAG,
MOVE BPREG,[440700,,ABUF]
MOVEI UTIL,<SBUFS*5>
DCBIN <IOREG>
CAILE IOREG," "
JRST DD$NA1
RETURN
DD$NAN: DCBIN <IOREG>
DD$NA1: CAIN IOREG,"."
JRST DD$NIN
CAIG IOREG," "
JRST DD$NA3
CAIE IOREG,42
JRST DD$NA2
DCBIN <IOREG>
DD$NA2: IDPB IOREG,BPREG
SOJG UTIL,DD$NAN
JRST DD$NER
DD$NA3: SETZ REG1,
IDPB REG1,BPREG
TSOUT <[ASCIZ / /],ABUF>
RETURN SKIP,1
DD$NIN: MOVE BPREG,[440700,,ABUF]
MOVEI UTIL,<SBUFS*5>
DD$NI1: DCBIN <IOREG>
CAIN IOREG,"."
JRST DD$NCN
CAIG IOREG," "
JRST DD$NCN
DD$NI2: CAIE IOREG,42
JRST DD$NI3
DCBIN <IOREG>
DD$NI3: IDPB IOREG,BPREG
SOJG UTIL,DD$NI1
JRST DD$NER
DD$NCN: SETZ REG1,
IDPB REG1,BPREG
SKIPN REG2,GBUF1(FLAG)
JRST DD$NON
HRLI REG2,440700
MOVE REG1,[440700,,ABUF]
DD$NC1: ILDB REG3,REG1
ILDB REG4,REG2
CAIE REG3,(REG4)
JRST DD$NON
JUMPN REG3,DD$NC1
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DD$NIN
DD$NON: CAIL FLAG,LBUFS-2
JRST DD$NER
SETZM GBUF1+1(FLAG)
HRL REG1,GBUF1+1(FLAG)
HRR REG1,GBUF1+2(FLAG)
BLT REG1,<GBUF1+LBUFS-1>
MOVE REG1,[440700,,ABUF]
SKIPN REG2,GBUF1(FLAG)
HRR REG2,GBUF2
HRLI REG2,440700
HRRZI BPREG,(BPREG)
SUBI BPREG,<ABUF-1>
ADDI BPREG,(REG2)
CAIL BPREG,<GBUF2+LBUFS>
JRST DD$NER
HRRZM REG2,GBUF1(FLAG)
DD$NO1: ILDB REG3,REG1
IDPB REG3,REG2
JUMPN REG3,DD$NO1
HRRZI REG2,1(REG2)
MOVEM REG2,GBUF2
MOVEI UTIL,(FLAG)
JUMPE R10,DD$NO2
TSOUT <CRLF>
DD$NO2: TSOUT <[ASCIZ / /]>
SOJGE UTIL,DD$NO2
TSOUT <ABUF>
SETO R10,
CAIG IOREG," "
RETURN SKIP,1
AOJA FLAG,DD$NIN
DD$NER: TSOUT <[ASCIZ / (Pathname too long.)/],CRLF>
ENDR
; DGET -- GET-RETRIEVE (NETWORK TO LOCAL)
;
DGET: BEGINR <IOREG,UTIL>
DCSOUT <[ASCIZ /OPEN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
DCSOUT <[ASCIZ /LIST /],ABUF,[ASCIZ / %SOURCE/],SEMI>
MOVE UTIL,[440700,,GBUF1]
CALLR RENPRE
CAME IOREG,[ASCII /.I280/]
JRST DGET3
CALLR RENLIN
DGET1: DCBIN <IOREG>
CAIN IOREG,12
JRST DGET4
CAIE IOREG,"*"
JRST DGET1
DGET2: DCBIN <IOREG>
CAIN IOREG,12
JRST DGET4
CAIN IOREG,"*"
JRST DGET3
IDPB IOREG,UTIL
JRST DGET2
DGET3: CALLR RENLIN
DGET4: SETZ IOREG,
IDPB IOREG,UTIL
CALLR RENDER
JRST .+1
CALLR NETNI
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DGETE5
; (((TOPS-10)))
IFE F.TENX,<
CALLR LOCDG
>
; (((↑↑↑)))
CALLR LOCOO
JRST DGETE3
DCSOUT <[ASCIZ /"<PORT">=/],ABUF,SEMI>
CALLR NETOI
JRST DGETE2
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I240/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I249/]
JRST DGETE1
CALLR RENLIN
TSOUT <[ASCIZ / [OK]/],CRLF>
CALLR MOVNL
CALLR RENPRE
CAME IOREG,[ASCII /.I260/]
JRST DGETE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I269/]
JRST DGETE1
CALLR RENLIN
CALLR MOVC
CALLR NETC
; (((TENEX+ITS)))
IFN F.TENX,<
CALLR LOCDG
>
; (((↑↑↑)))
CALLR LOCC
SETOM FLAGDE
CALLR RENDER
JRST DGETE3
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DGETE4
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
SKIPE FLAGTT
CALLR MOVR
RETURN SKIP,1
DGETE1: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
CALLR NETC
DGETE2: CALLR RENDER
JRST .+1
CALLR LOCC
DGETE3: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DGETE4: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
RETURN
DGETE5: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
ENDR
; DLIN -- DATACOMPUTER LINK
;
DLIN: BEGINR <IOREG,UTIL,FLAG>
MOVE FLAG,FLAGDD
DLINI: TSOUT (<[BYTE (7)76,0,0,0,0]>)
TSIN (ABUF,SBUFS,<[BYTE (7)76,0,0,0,0]>)
JRST DLINI
JUMPE UTIL,DLIN0
TSOUT <CRLF>
SETZM FLAGDD
DCSOUT <ABUF,CRLF>
SETOM FLAGDD
CALLR RENDER
JRST DLINI
JRST DLINI
DLIN0: CAIE IOREG,33
JRST DLINE
TSOUT <CRLF>
DLINA: TSOUT <[ASCIZ /$/]>
TSIN (ANCHOR,SBUFS,[ASCIZ /$/])
JRST DLINI
TSOUT <CRLF>
JUMPE UTIL,DLINA
JRST DLINI
DLINE: TSOUT <[ASCIZ /[Returning]/],CRLF>
MOVEM FLAG,FLAGDD
ENDR
; DPUT -- PUT-STORE (LOCAL TO NETWORK)
;
DPUT: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
CALLR LOCOI
RETURN
CALLR LOCDP
CALLR LOCS
JUMPG UTIL,DPUT1
TSOUT <[ASCIZ / (Empty local file.)/],CRLF>
JRST DPUTE6
DPUT1: CAMG UTIL,[SIZPAG*SIZFIL]
JRST DPUT2
TSOUT <[ASCIZ / (Local file too large.)/],CRLF>
JRST DPUTE6
DPUT2: DCSOUT <[ASCIZ /LIST /],PBUF,SEMI>
CALLR RENDER
JRST DPUT3
TAIN <[ASCIZ / [Old File][Confirm]/]>
JRST DPUTE6
JRST DPUTE6
DCSOUT <[ASCIZ /DELETE /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE6
JRST DPUT4
DPUT3: TSOUT <[ASCIZ / [New File]/],CRLF>
SKIPN GBUF2
JRST DPUT4
DCSOUT <[ASCIZ /LIST /],GBUF2,SEMI>
CALLR RENDER
JRST .+2
JRST DPUT4
DCSOUT <[ASCIZ /CREATE /],GBUF2,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE6
SETO FLAG,
DPUT4: DCSOUT <[ASCIZ /CREATE /],PBUF,<[ASCIZ / FILE STRING (0,/]>>
DCNOUT <UTIL>
DCSOUT <<[ASCIZ \),B=36,S=BINARY /*\]>,GBUF1,[ASCIZ \*/\],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE5
CALLR NETNO
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE4
DCSOUT <ABUF,[ASCIZ /="<PORT">/],SEMI>
CALLR NETOO
JRST DPUTE3
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DPUTE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I230/]
JRST DPUTE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I239/]
JRST DPUTE1
CALLR RENLIN
CALLR MOVLN
CALLR NETC
CALLR RENPRE
CAME IOREG,[ASCII /.I250/]
JRST DPUTE2
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I259/]
JRST DPUTE2
CALLR RENLIN
CALLR MOVC
CALLR LOCC
SETOM FLAGDE
CALLR RENDER
JRST DPUTE7
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DPUTE7
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
RETURN
SKIPE FLAGTT
CALLR MOVR
RETURN SKIP,1
DPUTE1: CALL NETC
DPUTE2: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
DPUTE3: CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DPUTE4: DCSOUT <[ASCIZ /DELETE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DPUTE5: JUMPE FLAG,DPUTE6
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
JRST .+1
DPUTE6: CALLR LOCC
RETURN
DPUTE7: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DELETE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DCSOUT <[ASCIZ /DELETE /],GBUF2,SEMI>
CALLR RENDER
RETURN
ENDR
; DVER -- VERIFY EQUIVALENCE OF LOCAL AND REMOTE DATA
;
DVER: BEGINR <IOREG,UTIL>
CALLR LOCOI
RETURN
DCSOUT <[ASCIZ /OPEN /],PBUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE6
CALLR NETNI
DCSOUT <[ASCIZ /CONNECT "<PORT"> /]>
DCNOUT <UTIL>
DCSOUT <SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE5
DCSOUT <[ASCIZ /"<PORT">=/],ABUF,SEMI>
CALLR NETOI
JRST DVERE2
CALLR RENPRE
CAME IOREG,[ASCII /;J205/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /.I240/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I249/]
JRST DVERE1
CALLR RENLIN
CALLR MOVV
CALLR RENPRE
CAME IOREG,[ASCII /.I260/]
JRST DVERE1
CALLR RENLIN
CALLR RENPRE
CAME IOREG,[ASCII /;I269/]
JRST DVERE1
CALLR RENLIN
CALLR MOVC
CALLR NETC
SETOM FLAGDE
CALLR RENDER
JRST DVERE3
DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST DVERE4
DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
CALLR LOCC
RETURN SKIP,1
DVERE1: LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CALLR RENLIP
CALLR NETC
DVERE2: CALLR RENDER
JRST .+1
DVERE3: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DVERE4: DCSOUT <[ASCIZ /DISCONNECT "<PORT">/],SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
CALLR LOCC
RETURN
DVERE5: DCSOUT <[ASCIZ /CLOSE /],ABUF,SEMI>
SETOM FLAGDE
CALLR RENDER
JRST .+1
DVERE6: CALLR LOCC
ENDR
; MOVC -- CHECKSUM TEST
;
MOVC: BEGINR <IOREG,FLAG>
CALLR RENPRE
CAME IOREG,[ASCII /;I275/]
JRST MOVC2
SETZ FLAG,
MOVC1: DCBIN <IOREG>
CAIE IOREG,"="
JRST MOVC1
SKIPN FLAG
SOJA FLAG,MOVC1
CALLR DCNIN
CAME IOREG,MOVSUM
JRST MOVC3
CALLR RENLIN
RETURN
MOVC2: CALLR RENLIP
RETURN
MOVC3: TSOUT <[ASCIZ / (Network Checksum Error.)/],CRLF>
CALLR RENLIN
ENDR
; MOVR -- CALCULATE AND PRINT MOVE RATE
;
MOVR: BEGINR <IOREG,<IOREG+1>>
TSOUT <[ASCIZ / (/]>
MOVEI IOREG,↑D36
IMULB IOREG,MOVSPA
IDIV IOREG,MOVTIM
TNOUT <IOREG>
TSOUT <[ASCIZ / Baud (/]>
MOVE IOREG,MOVSPA
TNOUT <IOREG>
TSOUT <[ASCIZ / bits in /]>
MOVE IOREG,MOVTIM
CAIN IOREG,0
MOVEI IOREG,1
TNOUT <IOREG>
HRRZI <IOREG+1>,[ASCIZ / seconds))/]
CAIN IOREG,1
HRRZI <IOREG+1>,[ASCIZ / second))/]
TSOUT <(IOREG+1),CRLF>
ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER: BEGINR <IOREG,UTIL,FLAG>
SETZ FLAG,
RENDIL: CALLR RENPRE
CAMN IOREG,[ASCII /.I220/]
JRST RENDES
CAMN IOREG,[ASCII /.I210/]
JRST RENDRR
LDB UTIL,[350700,,IOREG]
CAIN UTIL,"?"
JRST DEATH
CAIN UTIL,"!"
JRST RENDPM
SKIPE FLAGDE
JRST RENDPT
RENDNM: CALLR RENLIN
JRST RENDIL
RENDPT: SETZM FLAGDE
CAIN UTIL,";"
JRST RENDNM
CAIN UTIL,"."
JRST RENDNM
RENDPM: CALLR RENLIP
JRST RENDIL
RENDES: CALLR RENLIN
MOVEI IOREG,"L"-100
DCBOUT <IOREG>
AOJA FLAG,RENDIL
RENDRR: CALLR RENLIN
JUMPN FLAG,RETN(0)
ENDR SKIP,1
; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN: BEGINR <IOREG>
RENLNL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLNL
ENDR
; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP: BEGINR <IOREG>
SKIPN FLAGDD
JRST RENLPF
RENLPL: DCBIN <IOREG>
CAIE IOREG,12
JRST RENLPL
RETURN
RENLPF: DCBIN <IOREG>
CAIN IOREG,12
RETURN
CAIE IOREG,11
JRST RENLPF
MOVEI IOREG," "
TBOUT <IOREG>
MOVEI IOREG,"("
RENLPP: TBOUT <IOREG>
DCBIN <IOREG>
CAIE IOREG,15
JRST RENLPP
DCBIN <IOREG>
MOVEI IOREG,")"
TBOUT <IOREG>
TSOUT <CRLF>
ENDR
; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
; OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE: BEGINR <BPREG,UTIL,FLAG>
SETZ IOREG,
MOVE BPREG,[440700,,IOREG]
MOVEI FLAG,5
RENPRL: DCBIN <UTIL>
CAIN UTIL,15
JRST RENPRL
CAIN UTIL,12
JRST RENPRL
IDPB UTIL,BPREG
SOJG FLAG,RENPRL
ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH: CALLR RENLIP
TSOUT <[ASCIZ / ?? Fatal DATACOMPUTER error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
.VALUE
.BREAK 16,160000
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
HALTF
JRST .-1
>
; (((↑↑↑)))
; ***I/O ROUTINES***
; TAIN -- TERMINAL AUTHORIZATION INPUT
; IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$: BEGINR <IOREG>
MOVEI IOREG,(REG1)
TSOUT <(IOREG)>
TAIN1: TBIN <IOREG>
CAIN IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TAIN1
CAIN IOREG,177
JRST TAIN2
CAIN IOREG,"N"
JRST TAIN3
CAIN IOREG,"Y"
JRST TAIN4
CAIN IOREG,12
JRST TAIN5
CAIN IOREG,33
JRST TAIN5
CAIN IOREG,37
JRST TAIN5
CAIN IOREG," "
JRST TAIN5
MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TAIN1
TAIN2: TSOUT <[ASCIZ /XXX/],CRLF>
RETURN
TAIN3: TSOUT <[ASCIZ /No/],CRLF>
RETURN SKIP,1
TAIN4: TSOUT <[ASCIZ /Yes/]>
TAIN5: TSOUT <CRLF>
ENDR SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
; WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
; INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
; IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
; LINE FEED, EOL, OR SPACE WILL FINISH IT.
; IF NOT, SUCH CHARACTERS WILL BE REJECTED.
; ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
; ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
; IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
; POINTER TO COMMAND STRING LIST
; NUMBER OF COMMANDS
; NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
; NUMBER OF WORDS IN LARGEST COMMAND STRING
; <VALUE LIST>
; <COMMAND STRING LIST>
; OUT: TCIO -- LAST CHAR INPUT
; FLAG -- COMMAND VALUE
; RETURNS: SKIP,0 -- DELETE LINE
; SKIP,1 -- NULL COMMAND
; SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$: BEGINR <TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
MOVE TCIACB,TCIO
SETZ UTIL,
TCII01: MOVEM UTIL,TCIPCL(UTIL)
ADDI UTIL,1
CAME UTIL,1(TCIACB)
JRST TCII01
ADDI UTIL,TCIPCL
MOVEM UTIL,TCIPNF
HRRI UTIL,TCIPCL
HRL UTIL,1(TCIACB)
MOVEM UTIL,TCIPLP
MOVE TCIBP,[440700,,ABUF]
HRLI TCISBP,350700
HRR TCISBP,(TCIACB)
SETZ TCISCC,
TCICHR: TBIN <TCIO>
CAIN TCIO,"R"-100
JRST TCIREP
CAIN TCIO,"?"
JRST TCIQUA
CAIN TCIO,"A"-100
JRST TCIDEL
CAIN TCIO,"X"-100
JRST TCIENR
CAIN TCIO,177
JRST TCIENR
CAIN TCIO,15
IFL F.TENX,MOVEI TCIO,12
IFGE F.TENX,JRST TCICHR
CAIN TCIO,12
JRST TCIC01
CAIN TCIO,37
JRST TCIC01
CAIN TCIO," "
JRST TCIC01
CAIN TCIO,33
JRST TCIC01
CAIG TCIO," "
JRST TCIBAD
JRST TCIC02
TCIC01: JUMPE TCISCC,TCIENN
HLRZ UTIL,TCIPLP(TCISCC)
CAIN UTIL,1 ; OK IF JUST ONE POSSIBILITY
JRST TCIEND
TCIC02: SETZ TCIPCC,
MOVE TCIPBP,TCISBP
MOVE UTIL,TCIPNF
MOVEM UTIL,<TCIPLP+1>(TCISCC)
SETZ TCIMAC,
HRRZI TCIMAN,-1
TCIC03: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC04
CAIE UTIL,(TCIO)
JRST TCIC08
TCIC04: HLRZ TCITCC,TCIPLP(TCISCC)
HRRZ TCITLP,TCIPLP(TCISCC)
TCIC05: MOVE UTIL,(TCITLP)
CAIN UTIL,(TCIPCC)
JRST TCIC06
AOJ TCITLP,
SOJG TCITCC,TCIC05
JRST TCIC08
TCIC06: LDB UTIL,TCIPBP
JUMPE UTIL,TCIC07
AOJ TCIMAC,
MOVEM TCIPCC,@TCIPNF
AOS TCIPNF
JRST TCIC08
TCIC07: CAIN TCIMAN,-1
SETO TCIMAN,
CAIE TCIMAN,-1
HRRZI TCIMAN,(TCIPCC)
TCIC08: ADD TCIPBP,3(TCIACB)
AOJ TCIPCC,
CAME TCIPCC,1(TCIACB)
JRST TCIC03
CAIN TCIO,12
JRST TCIC09
CAIN TCIO,37
JRST TCIC09
CAIN TCIO," "
JRST TCIC09
CAIE TCIO,33
JRST TCIC10
TCIC09: JUMPL TCIMAN,TCIBAD
CAIN TCIMAN,-1
JRST TCIBAD
JRST TCIEND
TCIC10: JUMPE TCIMAC,TCIBAD
AOJ TCISCC,
HRLM TCIMAC,TCIPLP(TCISCC)
IBP TCISBP
IDPB TCIO,TCIBP
TBOUT <TCIO> ; ECHO
JRST TCICHR
TCIBAD: MOVEI TCIO,"G"-100
TBOUT <TCIO>
JRST TCICHR
TCIREP: TSOUT <CRLF>
HLRZ UTIL,TCIACB
TSOUT <(UTIL)>
HRRZI TCIPCC,(TCISCC) ; OUTPUT LOOP CONTROL = CHARS SO FAR
MOVE TCIPBP,[440700,,ABUF]
TCIR01: SOJL TCIPCC,TCICHR
ILDB TCIO,TCIPBP
TBOUT <TCIO>
JRST TCIR01
TCIQUA: TBOUT <TCIO> ; PRINT "?"
HLRZ TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
HRRZ TCIPBP,TCIPLP(TCISCC)
TCIQ01: TSOUT <CRLF>
MOVEI TCIO,11
TBOUT <TCIO>
MOVE TCITCC,2(TCIACB)
MOVE TCITLP,(TCIPBP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,440700
TCIQ02: ILDB TCIO,TCITLP
JUMPE TCIO,TCIQ03
TBOUT <TCIO>
SOJG TCITCC,TCIQ02
TCIQ03: AOJ TCIPBP,
SOJG TCIPCC,TCIQ01
JRST TCIREP
TCIDEL: JUMPLE TCISCC,TCIBAD ; THERE'S NO CHARACTER TO DELETE
MOVEI TCIO,"\"
TBOUT <TCIO>
LDB TCIO,TCIBP
TBOUT <TCIO>
SOJ TCIBP, ; FIX LINE BYTE PTR
IBP TCIBP
IBP TCIBP
IBP TCIBP
IBP TCIBP
HRRZ UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
MOVEM UTIL,TCIPNF
SOJ TCISBP, ; FIX SCAN BYTE PTR
IBP TCISBP
IBP TCISBP
IBP TCISBP
IBP TCISBP
SOJA TCISCC,TCICHR
TCIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETZ FLAG,
RETURN
TCIENN: SETZ FLAG,
RETURN SKIP,1
TCIEND: MOVE TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
MOVE TCITLP,(TCITLP)
IMUL TCITLP,3(TCIACB)
ADD TCITLP,(TCIACB)
HRLI TCITLP,440700
SETZ TCITCC,
TCIE01: IBP TCITLP
AOJ TCITCC,
CAIE TCITCC,(TCISCC)
JRST TCIE01
TCIE02: AOJ TCITCC,
CAMLE TCITCC,2(TCIACB)
JRST TCIE03
ILDB TCIMAC,TCITLP
JUMPE TCIMAC,TCIE03
TBOUT <TCIMAC>
JRST TCIE02
TCIE03: MOVE TCITLP,TCIPLP(TCISCC)
MOVE FLAG,(TCITLP)
ADDI FLAG,4(TCIACB)
MOVE FLAG,(FLAG)
ENDR SKIP,2
; TERMINAL STRING INPUT
; IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
; UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
; OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
; UTIL -- COUNT OF CHARACTERS
;
$TSIN$: BEGINR <BPREG,R10,R11,R12>
MOVE R10,IOREG
MOVE R11,UTIL
HLR BPREG,IOREG
HRLI BPREG,440700
SETZ UTIL,
TSICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TSIREP
CAIN IOREG,"A"-100
JRST TSIDEL
CAIN IOREG,"X"-100
JRST TSIENR
CAIN IOREG,177
JRST TSIENR
CAIN IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TSICHR
CAIN IOREG,12
JRST TSIEND
CAIN IOREG,33
JRST TSIEND
CAIN IOREG,37
JRST TSIEND
CAIGE IOREG," "
JRST TSIBAD
CAIL UTIL,(R10)
JRST TSIBAD
IDPB IOREG,BPREG
ADDI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TSICHR
TSIREP: TSOUT <CRLF>
TSOUT <(R11)>
JUMPL R11,TSICHR
HRRZI IOREG,(BPREG)
HLR R12,R10
CAIGE IOREG,(R12)
JRST TSICHR
HRLI R12,440700
TSIR01: CAMN R12,BPREG
JRST TSICHR
ILDB IOREG,R12
TBOUT <IOREG>
JRST TSIR01
TSIDEL: JUMPE UTIL,TSIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
SUBI UTIL,1
JUMPL R11,TSICHR
TBOUT <IOREG>
JRST TSICHR
TSIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETO IOREG,
SETZ UTIL,
RETURN
TSIEND: SETZ R12,
IDPB R12,BPREG
ENDR SKIP,1
; TERMINAL NUMBER INPUT
; IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
; OUT: IOREG -- NUMBER
;
$TNIN$: BEGINR <BPREG,UTIL,FLAG>
MOVE UTIL,IOREG
MOVE BPREG,[440700,,UBUF1]
SETZ FLAG,
TNICHR: TBIN <IOREG>
CAIN IOREG,"R"-100
JRST TNIREP
CAIN IOREG,"A"-100
JRST TNIDEL
CAIN IOREG,"X"-100
JRST TNIENR
CAIN IOREG,177
JRST TNIENR
CAIN IOREG,15
IFL F.TENX,MOVEI IOREG,12
IFGE F.TENX,JRST TNICHR
CAIN IOREG,12
JRST TNIEND
CAIN IOREG,33
JRST TNIEND
CAIN IOREG,37
JRST TNIEND
CAIN IOREG," "
JRST TNIEND
CAIGE IOREG,"0"
JRST TNIBAD
CAIL IOREG,"0"(UTIL)
JRST TNIBAD
CAILE FLAG,12 ; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
JRST TNIBAD
IDPB IOREG,BPREG
TBOUT <IOREG>
AOJA FLAG,TNICHR
TNIBAD: MOVEI IOREG,"G"-100
TBOUT <IOREG>
JRST TNICHR
TNIREP: TSOUT <CRLF>
HLRZ IOREG,UTIL
TSOUT <(IOREG)>
HRRZI IOREG,(BPREG)
CAIGE IOREG,UBUF1
JRST TNICHR
MOVE IOREG,[440700,,UBUF1]
TNIR01: CAMN IOREG,BPREG
JRST TNICHR
ILDB REG1,IOREG
TBOUT <REG1>
JRST TNIR01
TNIDEL: JUMPE FLAG,TNIBAD
MOVEI IOREG,"\"
TBOUT <IOREG>
LDB IOREG,BPREG
SOJ BPREG,
IBP BPREG
IBP BPREG
IBP BPREG
IBP BPREG
TBOUT <IOREG>
SOJA FLAG,TNICHR
TNIENR: TSOUT <[ASCIZ /XXX/],CRLF>
SETZ IOREG,
RETURN
TNIEND: SETZ IOREG,
IDPB IOREG,BPREG
MOVE BPREG,[440700,,UBUF1]
MOVEI FLAG,(UTIL)
TNICAL: ILDB UTIL,BPREG
JUMPE UTIL,RETN(1)
IMULI IOREG,(FLAG)
SUBI UTIL,"0"
ADDI IOREG,(UTIL)
JRST TNICAL
ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
; OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN: BEGINR <<IOREG+1>,UTIL>
SETZ IOREG,
DCNIN1: DCBIN <UTIL>
CAIGE UTIL,"0"
RETURN
CAILE UTIL,"9"
RETURN
JUMPL IOREG,DCNIN2
MULI IOREG,↑D10
CAILE IOREG,1
JRST DCNIN2
CAIN IOREG,1
TLO <IOREG+1>,400000
MOVE IOREG,<IOREG+1>
ADDI IOREG,-"0"(UTIL)
JRST DCNIN1
DCNIN2: SETO IOREG,
JRST DCNIN1
ENDR
; $NOUT$ -- INTEGER OUTPUT
; IN: REG1 -- INTEGER
; REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$: BEGINR <FLAG>
MOVE FLAG,REG2
MOVE REG3,[440700,,UBUF1]
MOVEI REG4,1
JUMPGE REG1,NOUT1
LSHC REG1,-↑D35
LSH REG2,-1
DIVI REG1,(FLAG)
JRST .+2
NOUT1: IDIVI REG1,(FLAG)
ADDI REG2,60
IDPB REG2,REG3
SKIPE REG1
AOJA REG4,NOUT1
MOVE REG1,[440700,,UBUF2]
NOUT2: LDB REG2,REG3
IDPB REG2,REG1
SOJ REG3,
IBP REG3
IBP REG3
IBP REG3
IBP REG3
SOJG REG4,NOUT2
IDPB REG4,REG1
SKIPL FLAG
JRST NOUT3
DCSOUT <UBUF2>
RETURN
NOUT3: TSOUT <UBUF2>
ENDR
; ***SYSTEM DEPENDENT ROUTINES***
; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
.OPEN TTI,[.UAI,,'TTY'] ; TTY input
THUD
.CALL [ SETZ
SIXBIT/TTYGET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVEM ; first set of character groups
MOVEM ; second set of character groups
SETZM REG1] ; TTYSTS variable
THUD
TLO REG1,200 ; disable **MORE** processing
MOVE [030303,,030303] ; turn off echoing
.CALL [ SETZ
SIXBIT/TTYSET/ ; set TTY parameters
MOVEI TTI ; TTY channel
MOVE ; first set of character groups
MOVE ; second set of character groups
SETZ REG1] ; TTYSTS variable
THUD
.OPEN TTO,[.UAO,,'TTY'] ; TTY output
THUD
.CALL [ SETZ ; host number
SIXBIT/NETHST/
MOVEI -1
MOVEM
SETZM LHOST]
THUD
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .UII!40050 ; OPEN on gensymmed socket, 32 bits
MOVEI ICP
[('NET')] ; network device
[-1] ; initial local socket is gensymmed
MOVEI DCSOKT ; initial foreign socket(DATACOMPUTER)
SETZI DCHOST] ; foreign host(CCA)
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI ICP
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
MOVE REG1,[ICP,,RCHBLK]
.RCHST REG1, ; get status of network channel
HRRE REG1,RCHBLK+4 ; get status of network
JUMPL REG1,NETDED ; network dead if .LE. 0
CAIN REG1,%NSCLI ; CLS w/ input?
JRST ICPWIN
CAIN REG1,%NSINP ; input available?
CAIN REG1,%NSOPN ; connection open?
JRST ICPWIN
JUMPN REG1,[THUD] ; any other condition is lossage
ICPCLS: TSOUT <[ASCIZ/Cannot establish network connection/]>
.BREAK 16,160000
NETDED: TSOUT <[ASCIZ/ARPAnet is down/]>
.BREAK 16,160000
ICPWIN: MOVE REG1,RCHBLK+1 ; get gensymmed local socket
ADDI REG1,2 ; receive
MOVEM REG1,LCLRCV
ADDI REG1,1 ; transmit
MOVEM REG1,LCLTRN
.IOT ICP,REG1 ; get foreign place's socket
.CLOSE ICP, ; free up ICP socket right away
MOVEM REG1,FORRCV ; receive
ADDI REG1,1 ; socket to me!
MOVEM REG1,FORTRN
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAI
MOVEI DCI ; DATACOMPUTER input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI 40!.UAO
MOVEI DCO ; DATACOMPUTER output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
JRST ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DCO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
MOVEI REG1,2 ; offset for data sockets
ADDM REG1,LCLRCV
ADDM REG1,LCLTRN
ADDM REG1,FORRCV
ADDM REG1,FORTRN
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: .IOT DCO,["Z"-100] ; SEND QUIT
QUIT1: DCBIN <IOREG>
JUMPGE IOREG,QUIT1
.CLOSE DCI,
.CLOSE DCO,
.BREAK 16,160000
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI DDI ; DATACOMPUTER data input
[('NET')]
LCLRCV
FORTRN
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDI
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI DDO ; DATACOMPUTER data output
[('NET')]
LCLTRN
FORRCV
SETZI DCHOST]
THUD
.CALL [ SETZ
SIXBIT/NETBLK/
MOVEI DDO
MOVEI %NSRFS
SETZM REG1] ; wait for connection
THUD
JUMPE REG1,ICPCLS
RETURN SKIP,1
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
.CLOSE DDI,
.CLOSE DDO,
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;
NETNI: BEGINR
MOVE UTIL,LCLRCV
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;
NETNO: BEGINR
MOVE UTIL,LCLTRN
ENDR
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BII
MOVEI LCI
LCLDEV
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOI1
RETURN SKIP,1
LOCOI1: TSOUT <[ASCIZ/ (Local file not found.)/],CRLF>
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
.CALL [ SETZ
SIXBIT/OPEN/
MOVSI .BIO
MOVEI LCO
LCLDEV
LCLFN1
LCLFN2
SETZ LCLSNM]
JRST LOCOO1
RETURN SKIP,1
LOCOO1: TSOUT <[ASCIZ/ ?? Local file creation failure ??/],CRLF>
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
.CLOSE LCI,
.CLOSE LCO,
ENDR
; LOCS -- LOCAL FILE (SIZE)
;
LOCS: BEGINR
.CALL [ SETZ
SIXBIT/FILLEN/
MOVEI LCI
SETZM UTIL]
SETZ UTIL, ; it should not crap out
ENDR
; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <BPREG,UTIL>
MOVE BPREG,[POINT 7,GBUF1]
ILDB UTIL,BPREG
JUMPE UTIL,RETN(0)
CAIN UTIL," "
MOVEI UTIL,"0"
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
MOVE REG2,[POINT 7,REG3]
SETZ REG3,
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
MOVEI REG2,↑D12
CAMN REG3,LOCDM-1(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
ILDB UTIL,BPREG
MOVEI REG3,-"0"(UTIL)
IMULI REG3,↑D10
ILDB UTIL,BPREG
ADDI REG3,-"0"(UTIL)
LSH REG3,↑D27
LSH REG2,↑D23
ADD REG3,REG2
MOVS REG1,REG1
ADD REG3,REG1
ILDB UTIL,BPREG
CAIE UTIL," "
RETURN
ILDB UTIL,BPREG
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
JUMPE UTIL,LOCDG1 ; ALLOW FOR TOPS-10SES
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
LSH REG1,1
CAIA
LOCDG1: IMULI REG1,↑D20
ADDI REG3,(REG1)
.CALL [ SETZ
SIXBIT/SFDATE/
MOVEI LCO
SETZ REG3]
JFCL
ENDR
; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
.CALL [ SETZ
SIXBIT/RFDATE/
MOVEI LCI
SETZM REG2]
MOVSI REG2,124201 ; ASSUME APRIL 1, 1984
MOVE REG1,[POINT 7,GBUF1]
LDB REG3,[POINT 5,REG2,17] ; DAY
IDIVI REG3,↑D10
ADDI REG3,"0"
CAIN REG3,"0"
MOVEI REG3," "
ADDI REG4,"0"
IDPB REG3,REG1
IDPB REG4,REG1
MOVEI REG3,"-"
IDPB REG3,REG1
LDB REG3,[POINT 4,REG2,12] ; MONTH
HRRI REG3,LOCDM-1(REG3)
HRLI REG3,(POINT 7,)
SCOPY (REG3,REG1)
MOVEI REG3,"-"
IDPB REG3,REG1
LDB REG3,[POINT 7,REG2,8] ; YEAR
IDIVI REG3,↑D10
ADDI REG3,"0"
ADDI REG4,"0"
IDPB REG3,REG1
IDPB REG4,REG1
MOVEI REG3," "
IDPB REG3,REG1
LDB REG2,[POINT 17,REG2,34] ; TIME IN SECONDS
IDIVI REG2,↑D3600
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
SETZ REG2,
IDPB REG2,REG1
ENDR ; return
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM: ASCII/JAN/
ASCII/FEB/
ASCII/MAR/
ASCII/APR/
ASCII/MAY/
ASCII/JUN/
ASCII/JUL/
ASCII/AUG/
ASCII/SEP/
ASCII/OCT/
ASCII/NOV/
ASCII/DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG>
MOVSI REG1,'DSK' ; set defaults
MOVEM REG1,LCLDEV
.SUSET [.RSNAME,,LCLSNM]
SETZM LCLFN1 ; < prevent assembly error
MOVSI REG1,'> '
MOVEM REG1,LCLFN2
HRLI IOREG,(POINT 7,)
LUTFN1: CALLR LUTWRD ; get a SIXBIT word
JUMPE REG1,LUTF1A
CAIN REG2,":" ; device
JRST [ MOVEM REG1,LCLDEV
JRST LUTFN1]
CAIN REG2,";" ; SNAME
JRST [ MOVEM REG1,LCLSNM
JRST LUTFN1]
SKIPN LCLFN1 ; FN1
JRST [ MOVEM REG1,LCLFN1
JRST LUTF1A]
MOVEM REG1,LCLFN2 ; FN2
LUTF1A: JUMPN REG2,LUTFN1
ENDR
; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN REG1, DELIMITER IN REG2
;
LUTWRD: BEGINR <BPREG>
SETZ REG1, ; initialize word, word pointer
MOVE BPREG,[POINT 6,REG1]
LUTWR1: ILDB REG2,IOREG ; get a character from buffer
CAIE REG2,":"
CAIN REG2,";"
JRST RETN(0)
CAIN REG2," "
JRST RETN(0)
JUMPE REG2,RETN(0)
SUBI REG2," " ; SIXBITify from ASCII
TRNN REG1,77 ; and save in word until word filled
IDPB REG2,BPREG
JRST LUTWR1
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <UTIL>
CALLR LOCS ; get length of file
MOVEM UTIL,MOVSPA
SETZM MOVSUM
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,MOVTIM
MOVLN1: MOVE REG1,[-2000,,IOBUFR]
.IOT LCI,REG1 ; read 1K from local file
JUMPL REG1,MOVLN2 ; hit EOF here
MOVE REG1,[-2000,,IOBUFR]
.IOT DDO,REG1
MOVSI REG1,-2000 ; compute checksum
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
JRST MOVLN1
MOVLN2: MOVEI REG1,-IOBUFR(REG1) ; get # of words transferred
JUMPE REG1,MOVLN3
MOVNS REG1
HRLZS REG1
PUSH STAK,REG1
HRRI REG1,IOBUFR
.IOT DDO,REG1
POP STAK,REG1
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
MOVLN3: .RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR
SETZM MOVSPA
SETZM MOVSUM
.RDTIM REG1,
IDIVI REG1,↑D30
MOVEM REG1,MOVTIM
MOVNL1: MOVE REG1,[-2000,,IOBUFR]
.IOT DDI,REG1 ; read 1K from DATACOMPUTER
JUMPL REG1,MOVNL2 ; hit EOF here
MOVEI REG1,2000
ADDM REG1,MOVSPA
MOVE REG1,[-2000,,IOBUFR]
.IOT LCO,REG1
MOVSI REG1,-2000 ; compute checksum
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
JRST MOVNL1
MOVNL2: MOVEI REG1,-IOBUFR(REG1) ; get # of words transferred
JUMPE REG1,MOVLN3
ADDM REG1,MOVSPA
MOVNS REG1
HRLZS REG1
PUSH STAK,REG1
HRRI REG1,IOBUFR
.IOT LCO,REG1
POP STAK,REG1
MOVE REG2,IOBUFR(REG1)
ADDM REG2,MOVSUM
AOBJN REG1,.-2
MOVNL3: .RDTIM REG1,
IDIVI REG1,↑D30
SUBM REG1,MOVTIM
ENDR
; MOVV -- VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZB UTIL,FLAG
SETZM MOVSUM
MOVV0: MOVE REG1,[-1000,,IOBUFR]
.IOT DDI,REG1
MOVE REG2,[-1000,,IOBUFR+1000]
.IOT LCI,REG2
HLLZ REG3,REG1
HLLZ REG4,REG2
MOVV1: MOVEI REG1,-IOBUFR(REG1)
JUMPE REG1,MOVV2
SETZ REG2,
MOVV01: CAIN FLAG,0
ADDI UTIL,1
MOVE IOREG,IOBUFR(REG2)
ADDM IOREG,MOVSUM
CAME IOREG,IOBUFR+1000(REG2)
ADDI FLAG,1
ADDI REG2,1
SOJG REG1,MOVV01
CAMN REG3,REG4 ; file sizes match?
JRST MOVV0
CAML REG3,REG4 ; DATACOMPUTER file smaller?
JRST MOVV4
JRST MOVV5 ; no
MOVV2: JUMPN FLAG,MOVV3
TSOUT <[ASCIZ / [OK]/],CRLF>
RETURN
MOVV3: CAIE FLAG,1
JRST MOVV3A
TSOUT <[ASCIZ / (There is one different word at /]>
JRST MOVV03
MOVV3A: TSOUT <[ASCIZ / (There are /]>
TNOUT <FLAG>
TSOUT <[ASCIZ / different words. The first difference is at /]>
MOVV03: TNOUT <UTIL>
TSOUT <[ASCIZ /.)/],CRLF>
RETURN
MOVV4: MOVE REG1,[-1000,,IOBUFR]
.IOT DDI,REG1 ; it gets upset if you don't read everything
MOVEI REG2,-IOBUFR(REG1)
JUMPE REG2,MOVV04
MOVE IOREG,IOBUFR-1(REG2)
ADDM IOREG,MOVSUM
SOJG REG2,.-2
JUMPL REG1,MOVV04
JRST MOVV4
MOVV04: TSOUT <[ASCIZ / (The datacomputer file is larger than the local file.)/],CRLF>
RETURN
MOVV5: TSOUT <[ASCIZ / (The local file is larger than the datacomputer file.)/],CRLF>
ENDR
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE 0,[SIXBIT/DFTP/]
SETNAM 0,
OPEN 0,[ 200 ; TURN OFF TTY ECHOING
SIXBIT /TTY/
0]
THUD
CALLR ICP
ENDR
; TOPS-10 ICP: 1) SET CONNECTION SOCKETS IN LISTENING STATE
; 2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 3) OPEN CONNECTION SOCKETS
; A) EVEN - RECEIVE
; B) ODD - SEND
;
ICP: BEGINR <IOREG,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG: SETZM ICPBLK+.IBDEV
SETZM DCIBLK+.IBDEV
SETZM DCOBLK+.IBDEV
SETZM DCIBLK+.IBRMT
SETZM DCOBLK+.IBRMT
MOVE IOREG,LINP ; LISTEN ON INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST .+2
JRST ICPICP
MOVE IOREG,DCIBLK+.IBERR
CAIE IOREG,.IESKT
JRST ICPEIL
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
LDB REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,102
SETZ REG3,
SETZ FLAG,
ICPRDV: MOVE IOREG,[SIXBIT/IMP/] ; RESET DEVICE(S) USED
MOVEM IOREG,WRKBLK+.IBDEV
MOVEI REG1,(REG3)
IDIVI REG1,10
JUMPE REG1,ICPRD1
ADDI REG1,20
ADDI REG2,20
DPB REG1,[140600,,WRKBLK+.IBDEV]
DPB REG2,[060600,,WRKBLK+.IBDEV]
JRST ICPRD2
ICPRD1: ADDI REG2,20
DPB REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2: SETZM WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/] ; TEST STATUS OF SOCKET
JRST ICPRD3
HRRZ IOREG,WRKBLK+.IBHST ; FOREIGN HOST
CAIE IOREG,DCHOST
JRST ICPRD3
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT ; OWNING JOB
CAIE REG2,(REG1)
JRST ICPRD3
MOVE IOREG,WRKBLK+.IBLCL
CAMN IOREG,UTIL ; DATALANGUAGE SOCKET(S)
JRST ICPCLS
SUBI IOREG,2
CAMN IOREG,UTIL ; INPUT DATA SOCKET
JRST ICPCLI
ICPRD3: MOVEI IOREG,1 ; OUTPUT DATA SOCKET
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
HRRZ IOREG,WRKBLK+.IBHST
CAIE IOREG,DCHOST
JRST ICPRD4
PJOB REG1,
HLRZ REG2,WRKBLK+.IBSTT
CAIE REG2,(REG1)
JRST ICPRD4
MOVE IOREG,WRKBLK+.IBLCL
SUBI IOREG,3
CAMN IOREG,UTIL
JRST ICPCLO
ICPRD4: ADDI REG3,1
CAIGE REG3,(REG4)
JRST ICPRDV
JUMPN FLAG,ICPBEG
TTCALL 3,[ASCIZ / (Connections in use.)/]
EXIT
ICPCLS: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVEI IOREG,1
MOVEM IOREG,WRKBLK+.IBLCL
MOVE IOREG,SWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / [Restarting]
/]
SETO FLAG,
JRST ICPRDV
ICPCLI: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Retrieve interrupted: connection closed.)
/]
JRST ICPRDV
ICPCLO: MOVE IOREG,CWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPERD
TTCALL 3,[ASCIZ / (Store interrupted: connection closed.)
/]
JRST ICPRDV
ICPICP: MOVE IOREG,DCIBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,DCOBLK+.IBDEV ; AND COPY IT FOR DUPLEX
MOVEM IOREG,DCCHAS+1
MOVE IOREG,LOUT ; LISTEN ON OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST ICPEOL
MOVE IOREG,OICP
CALL IOREG,[SIXBIT/IMPUUO/] ; OPEN CONNECTION
JRST ICPEC
MOVE IOREG,ICPBLK+.IBDEV ; GET DEVICE NAME
MOVEM IOREG,ICCHAS+1
OPEN DCCHAN,ICCHAS ; OPEN AS STANDARD DEVICE
JRST ICPEF
IN DCCHAN,
JRST .+2
JRST ICPET
MOVE IOREG,ICPBUF+1
MOVE IOREG,1(IOREG) ; GET THE SOCKET NUMBER
LSH IOREG,-4 ; RIGHT JUSTIFY 32 BITS
MOVEM IOREG,DCOBLK+.IBRMT
AOJ IOREG,
MOVEM IOREG,DCIBLK+.IBRMT
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
MOVE IOREG,OINP ; OPEN INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
MOVE IOREG,OOUT ; OPEN OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
OPEN DCCHAN,DCCHAS
JRST NETECF
OUT DCCHAN,
JRST .+2
JRST NETEOT
MOVE IOREG,PWRK
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT
HRRZ IOREG,WRKBLK+.IBHST
MOVEM IOREG,LHOST
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
>
; (((↑↑↑)))
ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT: MOVEI IOREG,"Z"-100
IDPB IOREG,DCOBUF+1
OUT DCCHAN,
JRST .+1
QUIT01: INPUT DCCHAN,
STATZ DCCHAN,20000
JRST QUIT02
SKIPN FLAGDD
JRST QUIT01
HRRZ REG1,DCIBUF
CALLR NUTDD
JRST QUIT01
QUIT02: RELEAS DCCHAN, ; RELEASE INPUT/OUTPUT DEVICE
QUIT03: MOVE IOREG,COUT ; CLOSE OUTPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEOC
QUIT04: MOVE IOREG,CINP ; CLOSE INPUT SOCKET
CALL IOREG,[SIXBIT/IMPUUO/]
JRST NETEIC
RESET
EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
SETZM DCDBLK+.IBDEV
MOVEI REG1,104
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCIBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOI1
RETURN SKIP,1
NETOI1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOI2
NETOI2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
SETZM DCDBLK+.IBDEV
MOVEI REG1,105
MOVEM REG1,DCDBLK+.IBLCL
MOVE REG1,DCOBLK+.IBRMT
ADDI REG1,2
MOVEM REG1,DCDBLK+.IBRMT
MOVE REG1,ODAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
MOVE REG1,DCDBLK+.IBDEV
MOVEM REG1,DDCHAS+1
OPEN DDCHAN,DDCHAS
JRST NETOO1
RETURN SKIP,1
NETOO1: MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETOO2
NETOO2: TTCALL 3,[ASCIZ / ?? Network connection OPEN failure ??
/]
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
RELEAS DDCHAN,
MOVE REG1,CDAT
CALL REG1,[SIXBIT/IMPUUO/]
JRST NETC1
RETURN
NETC1: TTCALL 3,[ASCIZ / ?? Network connection CLOSE failure ??
/]
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
; OUT: UTIL
;
NETNI: BEGINR
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,104
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
; OUT: UTIL
;
NETNO: BEGINR
GETPPN UTIL,
HRRZI UTIL,(UTIL)
LSH UTIL,11
ADDI UTIL,105
ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI: BEGINR
IN DCCHAN,
JRST .+2
JRST NETEIT
SKIPN FLAGDD
RETURN
HRRZ REG1,DCIBUF
CALLR NUTDD
ENDR
; NETWORK UTILITY -- MESSAGE OUTPUT
; IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO: BEGINR <IOREG,BPREG>
MOVEI BPREG,(REG1)
HRLI BPREG,440700
NUTMOL: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
SKIPE DCOBUF+2
JRST NUTMOB
SKIPN FLAGDD
JRST NUTMOO
HRRZ REG1,DCOBUF
CALLR NUTDD
NUTMOO: OUT DCCHAN,
JRST .+2
JRST NETEOT
NUTMOB: SOS DCOBUF+2
IDPB IOREG,DCOBUF+1
JRST NUTMOL
ENDR
; NETWORK UTILITY -- DISPLAY DATALANGUAGE
; IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD: BEGINR <IOREG,UTIL>
HLRZ UTIL,(REG1)
ADDI REG1,2
HRLI REG1,440700
TRZ UTIL,400000
SUBI UTIL,1
IMULI UTIL,5
NUTDDL: SOJL UTIL,RETN(0)
ILDB IOREG,REG1
JUMPE IOREG,RETN(0)
TTCALL 1,IOREG
JRST NUTDDL
ENDR
; FATAL NETWORK ERROR MESSAGES
;
ICPERD: TTCALL 3,[ASCIZ / ?? Restart failure ??/]
EXIT
ICPEIL: TTCALL 3,[ASCIZ / ?? Input socket listen failure ??/]
EXIT
ICPEOL: TTCALL 3,[ASCIZ / ?? Output socket listen failure ??/]
JRST QUIT04
ICPET: TTCALL 3,[ASCIZ / ?? ICP failure (transfer) ??/]
RELEAS DCCHAN, ; CLOSE AS STANDARD DEVICE
ICPEZ: MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/] ; CLOSE CONNECTION
JRST ICPEC
JRST QUIT03
ICPEF: TTCALL 3,[ASCIZ / ?? ICP failure (file control) ??/]
JRST ICPEZ
ICPEC: TTCALL 3,[ASCIZ / The datacomputer is unavailable/]
MOVE 0,ICPBLK+.IBERR
CAIN 0,.IESOF ; SOCKET OPEN FAILURE
TTCALL 3,[ASCIZ / (rejecting)/]
CAIN 0,.IEDWN
TTCALL 3,[ASCIZ / (down)/]
CAIN 0,.IETIM
TTCALL 3,[ASCIZ / (timeout)/]
TTCALL 3,[ASCIZ /.
/]
MOVE IOREG,CICP
CALL IOREG,[SIXBIT/IMPUUO/]
JRST QUIT03
JRST QUIT03
NETEIC: TTCALL 3,[ASCIZ / ?? Input failure (connection) ??/]
EXIT
NETEOC: TTCALL 3,[ASCIZ / ?? Output failure (connection) ??/]
JRST QUIT04
NETECF: TTCALL 3,[ASCIZ / ?? File control failure ??/]
JRST QUIT03
NETEIT: TTCALL 3,[ASCIZ / ?? Input failure (transfer) ??/]
JRST QUIT
NETEOT: TTCALL 3,[ASCIZ / ?? Output failure (transfer) ??/]
JRST QUIT
OICP: .IUCON,,ICPBLK
CICP: .IUCLS,,ICPBLK
LINP: .IULSN,,DCIBLK
OINP: .IUCON,,DCIBLK
CINP: .IUCLS,,DCIBLK
LOUT: .IULSN,,DCOBLK
OOUT: .IUCON,,DCOBLK
COUT: .IUCLS,,DCOBLK
ODAT: 001000+.IUCON,,DCDBLK ; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT: .IUCLS,,DCDBLK
PWRK: .IULHS,,WRKBLK
SWRK: .IUSTT,,WRKBLK
CWRK: .IUCLS,,WRKBLK
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOI1
LOOKUP LFCHAN,LFILE ; PREPARE FILE FOR INPUT
JRST LOCOI2
RETURN SKIP,1
LOCOI1: TTCALL 3,[ASCIZ / ?? Local channel OPEN failure ??
/]
RELEAS LFCHAN,
RETURN
LOCOI2: TTCALL 3,[ASCIZ / (Local file not found.)
/]
RELEAS LFCHAN,
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR <IOREG,<IOREG+1>>
RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS
JRST LOCOO2
MOVE IOREG,<LFILE+1>
MOVE <IOREG+1>,<LFILE+2>
LOOKUP LFCHAN,LFILE
JRST LOCOO1
TAIN <[ASCIZ / [Old Local File][Confirm]/]>
JRST .+3
JRST .+2
JRST LOCOO1
RELEAS LFCHAN,
RETURN
LOCOO1: RELEAS LFCHAN,
OPEN LFCHAN,LFCHAS ; INITIALIZE LOCAL CHANNEL
JRST LOCOO2
MOVEM IOREG,<LFILE+1>
MOVEM <IOREG+1>,<LFILE+2>
ENTER LFCHAN,LFILE ; PREPARE FILE FOR OUTPUT
JRST LOCOO2
RETURN SKIP,1
LOCOO2: TTCALL 3,[ASCIZ / ?? Local file creation failure ??
/]
RELEAS LFCHAN,
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
RELEAS LFCHAN,
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: UTIL -- SIZE IN WORDS
;
LOCS: BEGINR
SKIPL LFILE+3
JRST LOCS1
HLRO UTIL,LFILE+3 ; SIZE IN WORDS
MOVN UTIL,UTIL
RETURN
LOCS1: HLRZ UTIL,LFILE+3 ; SIZE IN BLOCKS
IMULI UTIL,SIZBLK
ENDR
; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <BPREG,UTIL>
MOVE BPREG,[440700,,GBUF1]
ILDB UTIL,BPREG
JUMPE UTIL,RETN(0)
CAIN UTIL," "
MOVEI UTIL,"0"
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
MOVE REG2,[440700,,REG3]
SETZ REG3,
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
ILDB UTIL,BPREG
IDPB UTIL,REG2
MOVEI REG2,↑D11
CAMN REG3,LOCDM(REG2)
JRST .+3
SOJGE REG2,.-2
RETURN
ILDB UTIL,BPREG
CAIE UTIL,"-"
RETURN
ILDB UTIL,BPREG
MOVEI REG3,-"0"(UTIL)
IMULI REG3,↑D10
ILDB UTIL,BPREG
ADDI REG3,-"0"(UTIL)
SUBI REG3,↑D64
IMULI REG3,↑D12
ADDI REG3,(REG2)
IMULI REG3,↑D31
ADDI REG3,-1(REG1)
ILDB UTIL,BPREG
CAIE UTIL," "
RETURN
ILDB UTIL,BPREG
MOVEI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,6
ILDB UTIL,BPREG
CAIE UTIL,":"
RETURN
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
IMULI REG1,↑D10
ILDB UTIL,BPREG
ADDI REG1,-"0"(UTIL)
DPB REG3,[001400,,LFILE+2]
LSH REG3,-14
DPB REG3,[170300,,LFILE+1]
DPB REG1,[141300,,LFILE+2]
ENDR
; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,[440700,,GBUF1]
LDB REG2,[001400,,LFILE+2] ; CREATION DATE
LDB REG3,[170300,,LFILE+1]
LSH REG3,14
IORI REG2,(REG3)
IDIVI REG2,↑D31
MOVEI REG4,(REG2)
MOVEI REG2,1(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
CAIN REG2,"0"
MOVEI REG2," "
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D12
MOVEI REG4,(REG2)
HRRI REG2,LOCDM(REG3)
HRLI REG2,440700
SCOPY (REG2,REG1)
MOVEI REG2,"-"
IDPB REG2,REG1
MOVEI REG2,↑D64(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2," "
IDPB REG2,REG1
LDB REG2,[141300,,LFILE+2] ; CREATION TIME
IDIVI REG2,↑D60
MOVEI REG4,(REG3)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
MOVEI REG2,":"
IDPB REG2,REG1
MOVEI REG2,(REG4)
IDIVI REG2,↑D10
ADDI REG2,"0"
ADDI REG3,"0"
IDPB REG2,REG1
IDPB REG3,REG1
SETZ REG2,
IDPB REG2,REG1
ENDR
; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM: ASCII /JAN/
ASCII /FEB/
ASCII /MAR/
ASCII /APR/
ASCII /MAY/
ASCII /JUN/
ASCII /JUL/
ASCII /AUG/
ASCII /SEP/
ASCII /OCT/
ASCII /NOV/
ASCII /DEC/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN: BEGINR <IOREG,BPREG,UTIL>
HRRI BPREG,(IOREG)
HRLI BPREG,440700
SETZM LFILE ; CLEAR OLD FILE NAME
SETZM LFILE+1 ; AND EXTENSION
SETZM LFILE+2
SETZM LFILE+3
MOVEI REG1,LUTFNT ; INITIALIZE XCT PNTR
MOVEI REG2,LFILE ; SET DESTINATION OF IOR
SETZ UTIL,
LUTFN1: ILDB IOREG,BPREG
JUMPE IOREG,RETN(0)
CAIN IOREG,"." ; PREPARE FOR FILE EXTENSION IF "."
JRST LUTFN2
CAILE UTIL,5
JRST LUTFN1
ADDI IOREG,40 ; CONVERT TO SIXBIT BY ADDITION
ANDI IOREG,77 ; AND REMOVAL OF HIGH BITS
XCT (REG1) ; EXECUTE THE PROPER ROTATE
IORM IOREG,(REG2) ; IOR RESULT INTO FILE OR FILE+1
AOJ REG1, ; INCREMENT THE XCT PNTR
AOJA UTIL,LUTFN1
LUTFN2: CAIN REG2,LFILE+1
JRST RETN(0) ; IGNORE MULTIPLE EXTENSIONS
MOVEI REG1,LUTFNT ; RESET PNTRS FOR EXTENSION
MOVEI REG2,LFILE+1
MOVEI UTIL,3
JRST LUTFN1
LUTFNT: ROT IOREG,-6 ; HIGH ORDER
ROT IOREG,-14
ROT IOREG,22
ROT IOREG,14
ROT IOREG,6
ROT IOREG,0 ; LOW ORDER
ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS: BEGINR
SKIPN LUTDSP
JRST LUTDSS
MOVE REG1,LUTDSP
SKIPN (REG1)
JRST LUTDSI
LUTDS1: MOVNI REG2,2
ADDM REG2,LDIBUF+2
SKIPGE LDIBUF+2
JRST LUTDSI
MOVE REG3,[440700,,ABUF]
HRLI REG1,440600
MOVEI REG2,6
LUTDS2: ILDB REG4,REG1
JUMPE REG4,LUTDS3
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS2
LUTDS3: ADDI REG1,1
LDB REG4,[222200,,(REG1)]
JUMPE REG4,LUTDS5
MOVEI REG4,"."
IDPB REG4,REG3
HRLI REG1,440600
MOVEI REG2,3
LUTDS4: ILDB REG4,REG1
JUMPE REG4,LUTDS5
ADDI REG4,40
IDPB REG4,REG3
SOJG REG2,LUTDS4
LUTDS5: SETZ REG4,
IDPB REG4,REG3
ADDI REG1,1
HRRZM REG1,LUTDSP
RETURN SKIP,1
LUTDSS: RELEAS LDCHAN,
GETPPN REG1,
MOVEM REG1,LDIR
MOVE REG1,[SIXBIT/UFD/]
MOVEM REG1,LDIR+1
SETZM LDIR+2
MOVE REG1,[1,,1]
MOVEM REG1,LDIR+3
OPEN LDCHAN,LDCHAS
JRST LUTDSE
LOOKUP LDCHAN,LDIR
JRST LUTDSE
IN LDCHAN,
JRST .+2
JRST LUTDSE
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
TTCALL 3,[ASCIZ / (No local files.)
/]
RELEAS LDCHAN,
RETURN
LUTDSI: IN LDCHAN,
JRST .+2
JRST LUTDSD
HRRZ REG1,LDIBUF
ADDI REG1,2
SKIPE (REG1)
JRST LUTDS1
RELEAS LDCHAN,
RETURN
LUTDSD: STATO LDCHAN,20000
LUTDSE: TTCALL 3,[ASCIZ / ?? Local directory failure ??
/]
RELEAS LDCHAN,
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <UTIL>
OUT DDCHAN,
JRST .+2
THUD
SETZM MOVSUM
CALLR LOCS
MOVEM UTIL,MOVSPA
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVLN1: IN LFCHAN,
JRST .+2
JRST MOVLN2
HRR REG1,LFIBUF
HRLI REG1,2(REG1)
HRR REG2,DDOBUF
HRRI REG1,2(REG2)
BLT REG1,<2+200-1>(REG2)
MOVE REG1,LFIBUF+2
ADDM REG1,DDOBUF+1
OUT DDCHAN,
JRST .+2
THUD
HRRZ REG2,LFIBUF
ADDI REG1,1(REG2)
ADDI REG2,2
SETZ REG3,
ADD REG3,(REG2)
CAIGE REG2,(REG1)
AOJA REG2,.-2
ADDM REG3,MOVSUM
JRST MOVLN1
MOVLN2: STATO LFCHAN,20000
THUD
MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR
OUT LFCHAN,
JRST .+2
THUD
SETZM LFOBUF+2 ; COUNT: # WORDS USED (REVERSE TOPS-10)
SETZM MOVSUM
SETZM MOVSPA
MSTIME REG1,
IDIVI REG1,↑D1000
MOVEM REG1,MOVTIM
MOVNL1: IN DDCHAN,
JRST .+2
JRST MOVNL4
MOVE REG1,DDIBUF+2
ADD REG1,LFOBUF+2
CAIL REG1,200
JRST MOVNL2
HRR REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF+1
AOJ REG2,
HRRZ REG1,LFOBUF+1
ADD REG1,DDIBUF+2
BLT REG2,(REG1)
MOVE REG1,DDIBUF+2
ADDM REG1,LFOBUF+1
ADDM REG1,LFOBUF+2
JRST MOVNL3
MOVNL2: HRRZI REG3,-200(REG1)
MOVEI REG4,200
SUB REG4,LFOBUF+2
HRR REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF+1
AOJ REG2,
MOVE REG1,LFOBUF
ADDI REG1,<2+200-1>
BLT REG2,(REG1)
HRRM REG1,LFOBUF+1
OUT LFCHAN,
JRST .+2
THUD
SETZM LFOBUF+2
JUMPE REG3,MOVNL3
MOVEM REG3,LFOBUF+2
ADDM REG3,LFOBUF+1
HRRZI REG2,(REG4)
ADD REG2,DDIBUF
HRLI REG2,2(REG2)
HRR REG2,LFOBUF
ADDI REG2,2
BLT REG2,@LFOBUF+1
MOVNL3: MOVE REG1,DDIBUF+2
ADDM REG1,MOVSPA
HRRZ REG2,DDIBUF
ADDI REG1,1(REG2)
ADDI REG2,2
SETZ REG3,
ADD REG3,(REG2)
CAIGE REG2,(REG1)
AOJA REG2,.-2
ADDM REG3,MOVSUM
JRST MOVNL1
MOVNL4: STATO DDCHAN,20000
THUD
SKIPN LFOBUF+2
JRST MOVNL5
OUT LFCHAN,
JRST MOVNL5
THUD
MOVNL5: MSTIME REG1,
IDIVI REG1,↑D1000
MOVE REG2,MOVTIM
CAMGE REG1,REG2
ADDI REG1,<↑D24*↑D60*↑D60>
SUB REG1,REG2
MOVEM REG1,MOVTIM
ENDR
; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZ UTIL,
SETZ FLAG,
SETZM MOVSUM
IN DDCHAN,
JRST .+2
THUD
IN LFCHAN,
JRST .+2
JRST MOVV4
MOVV1: CAIN FLAG,0
ADDI UTIL,1
SKIPLE LFIBUF+2
JRST .+4
IN LFCHAN,
JRST .+2
JRST MOVV2
SOS LFIBUF+2
AOS LFIBUF+1
MOVE IOREG,@<LFIBUF+1>
SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV5
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
CAMN IOREG,REG1
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: STATO LFCHAN,20000
THUD
SKIPLE DDIBUF+2
JRST MOVV4
IN DDCHAN,
JRST MOVV4
STATO DDCHAN,20000
THUD
JUMPN FLAG,MOVV3
TTCALL 3,[ASCIZ / [OK]
/]
RETURN
MOVV3: CAIE FLAG,1
JRST .+3
TTCALL 3,[ASCIZ / (There is one different word at /]
JRST MOVV03
TTCALL 3,[ASCIZ / (There are /]
TNOUT <FLAG>
TTCALL 3,[ASCIZ / different words, with the first difference at /]
MOVV03: TNOUT <UTIL>
TTCALL 3,[ASCIZ /.)
/]
RETURN
MOVV4: SKIPLE DDIBUF+2
JRST .+4
IN DDCHAN,
JRST .+2
JRST MOVV04
SOS DDIBUF+2
AOS DDIBUF+1
MOVE REG1,@<DDIBUF+1>
ADDM REG1,MOVSUM
JRST MOVV4
MOVV04: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
RETURN
MOVV5: STATO DDCHAN,20000
THUD
TTCALL 3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
ENDR
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT: BEGINR
MOVE REG1,[SIXBIT/DFTP/]
SETNM
HRRZI REG1,-1
RFMOD
TRZ REG2,006000 ; (1B24+1B25)
SFMOD
MOVE REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
MOVE REG3,[252525,,253000] ; AND EOL'S (NO NULLS)
SFCOC
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[LEVTAB,,CHNTAB]
SIR ; SET UP INTERRUPT TABLES
EIR ; ENABLE INTERRUPTS
MOVE REG1,[17,,0] ; ↑O ON CHANNEL 0
ATI
MOVEI REG1,400000 ; FOR THIS FORK
MOVE REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
AIC ; ACTIVATE CHANNELS
CALLR ICP
ENDR
; TENEX ICP: 1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
; 2) OPEN CONNECTION SOCKETS
; A) EVEN - INPUT
; B) ODD - OUTPUT
; JFN STRING: "NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:20./]
SETZ REG3,
SOUT ; LOCAL SOCKET 20+JOBREL
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT ; FAILURE -- MAKE HOST # INTO STRING
JRST .+1 ; CVHST SUCCESS OR NOUT FAILURE
MOVN REG2,DCSOCK
NOUT
JRST .+1
HRLZI REG1,1 ; SHORT GTJFN
HRROI REG2,UBUF1
GTJFN ; ICP CONNECTION
JRST ICPEG
MOVE REG2,[40B5+1B19] ; 32-BIT, READ
OPENF ; OPEN ICP CONNECTION
JRST ICPEO
BIN
MOVEM REG2,ICPSOC
CLOSF
JRST ICPEC
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:22./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; OUTPUT JFN
JRST ICPEIG
MOVEM REG1,DCOJFN
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN ; INPUT JFN
JRST ICPEOG
MOVEM REG1,DCIJFN
MOVE REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
OPENF
JRST ICPEIO
MOVE REG1,DCOJFN
MOVE REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST ICPEOO
MOVE REG1,[SIXBIT/LHOSTN/]
SYSGT
MOVEM REG1,LHOST
ENDR
; NETWORK QUIT
;
QUIT: MOVE REG1,DCOJFN
MOVEI REG2,"Z"-100
BOUT
MOVEI REG2,21
MTOPR
SETOM FLAGEF
QUIT01: DCBIN <IOREG>
SKIPE FLAGEF
JRST QUIT01
RESET
HALTF
JRST .-1 ; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:24./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,3
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOI2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
OPENF
JRST NETOI1
RETURN SKIP,1
NETOI1: RLJFN
JRST NETOI2
NETOI2: HRROI REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO: BEGINR
MOVE REG1,[440700,,UBUF1]
HRROI REG2,[ASCIZ /NET:25./]
SETZ REG3,
SOUT
MOVEI REG2,DCHOST
MOVEI REG3,10
CVHST
NOUT
JRST .+1
MOVN REG2,ICPSOC
SUBI REG2,2
NOUT
JRST .+1
HRLZI REG1,1
HRROI REG2,UBUF1
GTJFN
JRST NETOO2
MOVEM REG1,DCDJFN
MOVE REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
OPENF
JRST NETOO1
RETURN SKIP,1
NETOO1: RLJFN
JRST NETOO2
NETOO2: HRROI REG1,[ASCIZ / ?? Network connection OPEN failure ??
/]
PSOUT
ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC: BEGINR
MOVE REG1,DCDJFN
CLOSF
JRST NETC1
RETURN
NETC1: HRROI [ASCIZ / ?? Network connection CLOSE failure ??
/]
PSOUT
ENDR
; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
; OUT: UTIL
;
NETNI: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,24
ENDR
; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
; OUT: UTIL
;
NETNO: BEGINR
GJINF
HRRZI UTIL,(REG2) ; CONNECT DIRECTORY
LSH UTIL,↑D15 ; PAST 5 LOW DIGITS
ADDI UTIL,25
ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ: PSOUT
RESET
HALTF
JRST .-1
ICPEG: HRROI REG1,[ASCIZ / The datacomputer is unavailable (network)./]
JRST NETEQ
ICPEO: HRROI REG1,[ASCIZ / The datacomputer is unavailable (down)./]
JRST NETEQ
ICPEC: HRROI REG1,[ASCIZ / ?? ICP CLOSF failure ??/]
JRST NETEQ
ICPEOG: HRROI REG1,[ASCIZ / ?? ICP output GTJFN failure ??/]
JRST NETEQ
ICPEIG: HRROI REG1,[ASCIZ / ?? ICP input GTJFN failure ??/]
JRST NETEQ
ICPEIO: HRROI REG1,[ASCIZ / ?? ICP output OPENF failure ??/]
JRST NETEQ
ICPEOO: HRROI REG1,[ASCIZ / ?? ICP input OPENF failure ??/]
JRST NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI: BEGINR
HRLZI REG1,100001 ; OLD FILE, SHORT CALL
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOI1
HRRZM REG1,LJFN
MOVE REG2,[440000,,200000] ; 36-BIT, READ
OPENF
JRST LOCOI2
RETURN SKIP,1
LOCOI1: HRROI REG1,[ASCIZ / (Local file not found.)
/]
PSOUT
RETURN
LOCOI2: HRROI REG1,[ASCIZ / (Local file not available.)
/]
PSOUT
MOVE REG1,LJFN
RLJFN
RETURN
ENDR
; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO: BEGINR
HRLZI REG1,600001 ; VN, WRITE, SHORT
MOVE REG2,[440700,,LFILE]
GTJFN
JRST LOCOO2
HRRZM REG1,LJFN
MOVE REG2,[440000,,100000] ; 36 BIT BYTE, READ
OPENF
JRST LOCOO1
RETURN SKIP,1
LOCOO1: MOVE REG1,LJFN
RLJFN
JRST .+1
LOCOO2: HRROI REG1,[ASCIZ / ?? Local file creation failure ??
/]
PSOUT
ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC: BEGINR
MOVE REG1,LJFN
CLOSF
JRST LOCC1
RETURN
LOCC1: HRROI REG1,[ASCIZ / ?? Local file CLOSE failure ??
/]
PSOUT
ENDR
; LOCS -- LOCAL (FILE) SIZE
; OUT: UTIL -- SIZE IN WORDS
;
LOCS: BEGINR
MOVE REG1,LJFN
MOVE REG2,[2,,11] ; READ 2 WORDS, OFFSET OF 11
HRRZI REG3,UBUF1
GTFDB
JRST .+3
SETZ UTIL,
RETURN
LDB REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
MOVEI REG2,↑D36
IDIVI REG2,(REG1) ; BYTES/WD
MOVE REG3,UBUF1+1 ; BYTE COUNT TO EOF
ADDI REG3,-1(REG2) ; ACCOUNT FOR TRUNCATION
IDIVI REG3,(REG2) ; NUMBER OF WORDS
MOVE UTIL,REG3
ENDR
; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG: BEGINR <IOREG,UTIL>
HRROI REG1,GBUF1
SETZ REG2,
IDTIM
RETURN
MOVE IOREG,REG2
MOVEI REG1,400000 ; FOR THIS FORK
RPCAP
TRNN REG2,600000 ; (1B18+1B19) WHEEL OR OPER
RETURN
MOVE UTIL,REG3
TRO REG3,(REG2)
EPCAP ; ENABLE (!)
HRR REG1,LJFN
HRLI REG1,14 ; OFFSET 14 (LAST WRITE)
SETO REG2,
MOVE REG3,IOREG
CHFDB
JRST .+1
MOVEI REG1,400000
MOVE REG3,UTIL
EPCAP ; RESET CAPABILITIES
ENDR
; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP: BEGINR
MOVE REG1,LJFN
MOVE REG2,[1,,14] ; 1 WORD, OFFSET 14 (LAST WRITE)
HRRZI REG3,GBUF1
GTFDB
JRST .+3
SETZM GBUF1
RETURN
HRROI REG1,GBUF1
MOVE REG2,GBUF1
SETZ REG3,
ODTIM
ENDR
; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN: BEGINR <IOREG,UTIL>
SETZM MOVSUM
CALLR LOCS
MOVEM UTIL,MOVSPA
MOVN IOREG,UTIL
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVLN1: MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SIN
MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
CAMGE REG3,IOREG
MOVE REG3,IOREG
SOUT
MOVN UTIL,IOREG
CAILE UTIL,SIZPAG
MOVEI UTIL,SIZPAG
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
ADDI IOREG,SIZPAG
JUMPL IOREG,MOVLN1
MOVE REG1,DCDJFN
MOVEI REG2,21
MTOPR
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL: BEGINR <UTIL>
SETOM FLAGEF
SETZM MOVSUM
SETZM MOVSPA
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVEM REG3,MOVTIM
MOVNL1: MOVE REG1,DCDJFN
MOVE REG2,[444400,,PAGE]
MOVNI REG3,SIZPAG
SIN
MOVE REG1,LJFN
MOVE REG2,[444400,,PAGE]
ADDI REG3,SIZPAG ; WORDS RECEIVED
JUMPE REG3,MOVNL2
MOVEI UTIL,(REG3)
MOVNI REG3,(REG3)
SOUT
ADDM UTIL,MOVSPA
SETZ REG1,
ADD REG1,<PAGE-1>(UTIL)
SOJG UTIL,.-1
ADDM REG1,MOVSUM
MOVNL2: SKIPE FLAGEF
JRST MOVNL1
MOVNI REG1,5
RUNTM
IDIV REG3,REG2
MOVE REG2,MOVTIM
SUB REG3,REG2
MOVEM REG3,MOVTIM
ENDR
; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV: BEGINR <IOREG,UTIL,FLAG>
SETZ UTIL,
SETZ FLAG,
SETOM FLAGEF
SETZM MOVSUM
MOVV1: CAIN FLAG,0
ADDI UTIL,1
MOVE REG1,LJFN
BIN
SKIPN FLAGEF
JRST MOVV2
MOVE IOREG,REG2
MOVE REG1,DCDJFN
BIN
SKIPN FLAGEF
JRST MOVV5
ADDM REG2,MOVSUM
CAMN IOREG,REG2
JRST MOVV1
AOJA FLAG,MOVV1
MOVV2: SETOM FLAGEF
MOVE REG1,DCDJFN
BIN
SKIPE FLAGEF
JRST MOVV4
JUMPN FLAG,MOVV3
HRROI REG1,[ASCIZ / [OK]
/]
PSOUT
RETURN
MOVV3: CAIE FLAG,1
JRST .+4
HRROI REG1,[ASCIZ / (There is one different word at /]
PSOUT
JRST MOVV03
HRROI REG1,[ASCIZ / (There are /]
PSOUT
TNOUT <FLAG>
HRROI REG1,[ASCIZ / different words, with the first difference at /]
PSOUT
MOVV03: TNOUT <UTIL>
HRROI REG1,[ASCIZ /.)
/]
PSOUT
RETURN
MOVV4: ADDM REG2,MOVSUM
BIN
SKIPE FLAGEF
JRST MOVV4
HRROI REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
PSOUT
RETURN
MOVV5: HRROI REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
PSOUT
ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI: SETOM FLAGCO
DEBRK
EOFPSI: SKIPN FLAGEF
JRST EOFPSE
SETZM FLAGEF
DEBRK ; RETURN FROM INTERRUPT
EOFPSE: HRROI REG1,[ASCIZ / ?? Unexpected EOF at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSI: HRRZ REG1,PSIPC1
MOVE REG2,-1(REG1)
CAMN REG2,[GTFDB]
JRST ILIPSD
CAMN REG2,[CHFDB]
JRST ILIPSD
HRROI REG1,[ASCIZ / ?? Illegal instruction at /]
CAMN REG2,[-1]
HRROI REG1,[ASCIZ / ?? Impossible event at /]
PSOUT
MOVEI REG1,101
HRRZ REG2,PSIPC1
SUBI REG2,1
MOVEI REG3,10
SETZ REG4,
NOUT
JRST .+1
HRROI REG1,[ASCIZ / ??
/]
PSOUT
HALTF
JRST .-1
ILIPSD: HRROI REG1,[ASCIZ / (Bad local device.)
/]
PSOUT
AOS PSIPC1
DEBRK ; RETURN FROM INTERRUPT
>
; (((↑↑↑)))
; ***DATA***
CRLF: BYTE (7)15,12,0,0,0
SEMI: BYTE (7)73,15,12,0,0
HOSTS: 11,,[ASCIZ /HARVARD/]
13,,[ASCIZ /ITS/] ; SAIL
37,,[ASCIZ /CCA/]
53,,[ASCIZ /OFFICE"-1/]
55,,[ASCIZ /SCI/]
56,,[ASCIZ /RUTGERS/]
61,,[ASCIZ /BBN/] ; TENEXB
70,,[ASCIZ /SUMEX/]
102,,[ASCIZ /AIC/]
106,,[ASCIZ /ITS/] ; DMS
126,,[ASCIZ /ISI/] ; ISI
162,,[ASCIZ /BBN/] ; TENEXD
206,,[ASCIZ /ITS/] ; AI
226,,[ASCIZ /ISI/] ; ISIC
305,,[ASCIZ /BBN/] ; TENEXA
306,,[ASCIZ /ITS/] ; ML
326,,[ASCIZ /ISI/] ; ISID
354,,[ASCIZ /ITS/] ; MC
361,,[ASCIZ /BBN/] ; TENEXC
364,,[ASCIZ /ISI/] ; ISIB
0
LIT ; LITERALS GO HERE
; (((ITS)))
IFL F.TENX,<
IOBUFR: BLOCK 2000
LCLDEV: BLOCK 1 ; local device
LCLFN1: BLOCK 1
LCLFN2: BLOCK 1
LCLSNM: BLOCK 1 ; SNAME
RCHBLK: BLOCK 10 ; network status goes here
LCLRCV: BLOCK 1
LCLTRN: BLOCK 1
FORRCV: BLOCK 1
FORTRN: BLOCK 1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
RELOC 0
IFE F.SAIL,<
ICPBLK: SIXBIT /IMP/
0
100 ; LOCAL SOCKET
40,,DCHOST ; 32 BIT BYTES (ICP), CCA HOST
DCSOKT ; DATACOMPUTER SOCKET
DCIBLK: SIXBIT /IMP/
0
102 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP + 1
DCOBLK: SIXBIT /IMP/
0
103 ; LOCAL SOCKET
10,,DCHOST ; 8 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP
DCDBLK: SIXBIT /IMP/
0
0 ; LOCAL SOCKET (104 RECEIVE, 105 SEND)
44,,DCHOST ; 36 BIT BYTES, HOST
0 ; CCA SOCKET FROM ICP +2 OR +3
WRKBLK: BLOCK 5
ICCHAS: 10 ; IMAGE MODE
SIXBIT /IMP/
0,,ICPBUF
ICPBUF: BLOCK 3
DCCHAS: 0 ; 7 BIT ASCII MODE
SIXBIT /IMP/
DCOBUF,,DCIBUF
DCIBUF: BLOCK 3
DCOBUF: BLOCK 3
DDCHAS: 13 ; BINARY
SIXBIT /IMP/
DDOBUF,,DDIBUF
>
; (((↑↑↑)))
DDIBUF: BLOCK 3
DDOBUF: BLOCK 3
LFILE: 0 ; LOCAL FILE NAME
0 ; EXTENSION
0 ; PROTECTION AND CREATION DATE
0 ; PROJ-PROG - 0 IS SELF
LFCHAS: 13 ; BINARY MODE
SIXBIT /DSK/
LFOBUF,,LFIBUF
LFIBUF: BLOCK 3
LFOBUF: BLOCK 3
LDIR: 0 ; PROJ-PROG OF USER
0 ; "UFD"
0
0 ; [1,1]
LDCHAS: 13
SIXBIT /DSK/
0,,LDIBUF
LDIBUF: BLOCK 3
LUTDSP: 0
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
LEVTAB: PSIPC1
PSIPC2
PSIPC3
PSIPC1: BLOCK 1
PSIPC2: BLOCK 1
PSIPC3: BLOCK 1
CHNTAB: 1,,TCOPSI
REPEAT 9,<EXP 0>
1,,EOFPSI
REPEAT 4,<EXP 0>
1,,ILIPSI
REPEAT ↑D20,<EXP 0>
FLAGCO: 0
FLAGEF: 0
DCSOCK: DCSOKT
ICPSOC: 0 ; ICP SOCKET
DCIJFN: 0 ; DC INPUT JFN
DCOJFN: 0 ; DC OUTPUT JFN
DCDJFN: 0 ; DC DATA JFN
LFILE: BLOCK SBUFS
LJFN: 0
PAGE: BLOCK SIZPAG
>
; (((↑↑↑)))
; * VARIABLES
LHOST: 0
ANCHOR: ASCIZ /DFTP/
BLOCK <SBUFS-1>
CMDMOD: 0
FLAGDD: 0
FLAGDE: 0
FLAGTT: -1
MOVSUM: 0
MOVSPA: 0
MOVTIM: 0
; * BLOCKS
CONTEX: BLOCK LBUFS
ABUF: BLOCK SBUFS
UBUF1: BLOCK LBUFS
UBUF2: BLOCK SBUFS
PBUF: BLOCK LBUFS
GBUF1: BLOCK LBUFS
GBUF2: BLOCK LBUFS
TCIPCL: BLOCK 100 ; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP: 0 ; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
BLOCK 37 ; (SIZE = # CHARS IN LARGEST CMD)
TCIPNF: 0 ; P(OSSIBLE)N(EXT)F(REE)
STSIZ==100
STBEG: BLOCK STSIZ
-1 ; cretinous LINK-10 bug
END DFTP
βββ